タグ付けされた質問 「templates」

テンプレートタグは、汎用プログラミング(特にC ++)、およびテンプレートエンジンを使用したデータ/ドキュメントの生成など、複数のコンテキストで使用されます。このタグを実装の重い質問に使用する場合-実装が記述されているコード言語にタグを付けます。

1
Clangは、クラステンプレートのネストされたクラスが特殊化によってのみ定義されているコードを拒否することは正しいですか?
次のクラステンプレートがあるとします。 template<typename T> struct Outer { struct Inner; auto f(Inner) -> void; }; のInner専門化ごとに個別に定義しますOuter。 template<> struct Outer<int>::Inner {}; template<> struct Outer<double>::Inner {}; 次にf、すべての特殊化についてメンバー関数を1回定義しますOuter。 auto Outer<T>::f(Inner) -> void { } しかしClang(9.0.0)は不平を言います: error: variable has incomplete type 'Outer::Inner' auto Outer<T>::f(Inner) -> void ^ Inner他のすべての特殊化の定義も提供することにより、コンパイラエラーを回避できますOuter。 template<typename T> struct Outer<T>::Inner {}; または、f専門化ごとに個別に定義することにより: template<> auto …

2
あいまいなオーバーロードテンプレート
次のテンプレートコードがあります #include <vector> #include <array> #include <iostream> template<typename T1> void foo(std::vector<T1> bar) { std::cout << "GENERIC" << std::endl; } template<typename T1> void foo(std::vector<std::vector<T1>> bar) { std::cout << "SPECIFIC (vector)" << std::endl; } template<typename T1, int SIZE> void foo(std::vector<std::array<T1, SIZE>> bar) { std::cout << "SPECIFIC (array)" << std::endl; } int main() …
16 c++  templates 

2
テンプレートのtypename引数への参照を渡す方法
参照を引数としてテンプレートのtypename引数に渡す方法はありますか?たとえば、intへの参照を渡すために、intを渡す代わりにそうします。 template <typename T> struct Foo { Foo(T arg) : ptr(arg) {} T ptr; }; int main() { int* a = new int(6); Foo<decltype(a)> foo1(a); // ptr is a copy of a pointer Foo<decltype(&a)> foo1(&a); // ptr seems to be a pointer to a pointer } 「ptr」メンバーをクラスでT&にすることでポインターへの参照にできることはわかっていますが、これはテンプレート引数に渡された引数から実行できるかどうか疑問に思っていました。
16 c++  templates 

3
可変個のテンプレート:グループで引数を展開
2つの引数を取る関数があります。 template <typename T1, typename T2> void foo(T1 arg1, T2 arg2) { std::cout << arg1 << " + " << arg2 << '\n'; } そして、その引数をペアで転送するべき可変部分: template <typename... Args> void bar(Args&&... args) { static_assert(sizeof...(Args) % 2 == 0); ( foo( std::forward<Args>(args), std::forward<Args>(args) ), ... ); // ^ Sends each argument twice, …

5
テンプレートクラスを生成するためのforループにconst変数を含めるにはどうすればよいですか?
私のようなコードがあります template <size_t N> class A { template <size_t N> someFunctions() {}; }; 次に、クラスのインスタンスを作成し、そのような関数をforループで呼び出して、次のような多くの値のセットを取得します // in main() int main() { for (int i = 1; i <= 100; i++) { const int N = i; // dont know how to do this A<N> a; a.functionCalls(); } } これを行う方法?これを行う方法を期待しています。

1
Clangはコードをコンパイルしませんが、gccとmsvcはそれをコンパイルしました
何が問題なのか理解できません。コードまたはコンパイラ(可能性が低い)のどちらかです。次のようなコードがあります。 #include <iostream> #include <type_traits> #include <set> template<typename T, typename = void> struct TestA: std::false_type {}; template<typename T> struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {}; template<typename T> struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {}; int main() { std::cout << TestA<std::set<int>>::value; } GCCとMSVCの両方でコンパイルします。GCCとMSVC 17(ローカル)および19の異なるバージョンを使用して、godboltでテストしました。リンクは次のとおりです:https ://godbolt.org/z/Enfm6L 。 しかし、Clangはそれをコンパイルせず、エラーを出します。 redefinition of `'TestA<T, std::void_t<typename …

2
オブジェクトが整数であるかどうか、またはクラス型であるかどうかを知る上でのポイントは何ですか?
こんにちは私はCppreference.comでこのような多くの例を見てきました: std::is_class<T> std::is_integral 等々。たとえば、trueまたはを取得してコードを実行するかどうかを知っていますfalse。しかし、その意味は何ですか?たとえば、オブジェクトがクラス型であるかどうかを知っていますか? #include <iostream> #include <type_traits> struct A {}; class B {}; enum class C {}; int main() { std::cout << std::boolalpha; std::cout << std::is_class<A>::value << '\n'; std::cout << std::is_class<B>::value << '\n'; std::cout << std::is_class<C>::value << '\n'; std::cout << std::is_class<int>::value << '\n'; } 出力: true true false false …
14 c++  templates 

3
テンプレート関数がconst refを取得するメンバーへのポインター関数に対して機能しない
最近、私はいくつかのコードの繰り返しを解決するためにテンプレート関数を書きました。次のようになります。 template<class T, class R, class... Args> R call_or_throw(const std::weak_ptr<T>& ptr, const std::string& error, R (T::*fun)(Args...), Args... args) { if (auto sp = ptr.lock()) { return std::invoke(fun, *sp, args...); } else { throw std::runtime_error(error.c_str()); } } int main() { auto a = std::make_shared<A>(); call_or_throw(std::weak_ptr<A>(a), "err", &A::foo, 1); } このコードはclass A、次のように完全に機能します。 …
14 c++  templates 

3
関数が定義されているタイプに対してのみ、関数テンプレート内で関数を実行します
入力としてさまざまなタイプを受け取る関数テンプレートがあります。それらのタイプのうち、そのうちの1つだけがgetInt()機能を持っています。したがって、コードでそのタイプに対してのみ関数を実行する必要があります。解決策を提案してください。ありがとう #include <type_traits> #include <typeinfo> class X { public: int getInt(){ return 9; } }; class Y{ }; template<typename T> void f(T& v){ // error: 'class Y' has no member named 'getInt' // also tried std::is_same<T, X>::value if(typeid(T).name() == typeid(X).name()){ int i = v.getInt();// I want this to be called …

1
テンプレートクラスの構造体でのC ++コンパイラの問題
次のコードは、gccまたはclangでコンパイルできません。 template<class T> class foo{}; template<class T> class template_class_with_struct { void my_method() { if(this->b.foo < 1); }; struct bar { long foo; } b; }; エラーメッセージは error: type/value mismatch at argument 1 in template parameter list for 'template<class T> class foo' 8 | if(this->b.foo < 1); エラーはtemplatクラスfooが原因で発生します。<1の代わりに<=を書き込むと、コンパイルも行われます。 ヒントはありますか? CompilerExplorerリンクhttps://godbolt.org/z/v6Tygo

6
C ++でジェネリック構造体を比較する方法は?
構造体を一般的な方法で比較したいのですが、次のようなことをしました(実際のソースを共有できないため、必要に応じて詳細を尋ねます)。 template<typename Data> bool structCmp(Data data1, Data data2) { void* dataStart1 = (std::uint8_t*)&data1; void* dataStart2 = (std::uint8_t*)&data2; return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0; } 2つの構造体インスタンスに同じメンバーが含まれている場合(ただし、Eclipseデバッガーで確認しました)でもfalseを返す場合があることを除いて、これはほとんど意図どおりに機能します。いくつか検索した後memcmp、使用された構造体が埋め込まれているために失敗する可能性があることを発見しました。 パディングに無関心なメモリを比較するより適切な方法はありますか?使用する構造体を変更することはできません(使用しているAPIの一部です)。使用する多くの異なる構造体にはいくつかの異なるメンバーがあるため、一般的な方法で個別に比較することはできません(私の知る限り)。 編集:残念ながら、C ++ 11を使用しています。これは以前に言及したはずです...

2
ラムダでstatic_assertを指定したconstexprの場合、どのコンパイラが正しいですか?
static_assertでa if constexprを使用する場合は、条件をいくつかのテンプレートパラメータに依存させる必要があります。興味深いことに、コードがラムダでラップされている場合、gccとclangは一致しません。 次のコードはgccでコンパイルされますが、clang if constexprがtrueでなくても、clangはアサートをトリガーします。 #include <utility> template<typename T> constexpr std::false_type False; template<typename T> void foo() { auto f = [](auto x) { constexpr int val = decltype(x)::value; if constexpr(val < 0) { static_assert(False<T>, "AAA"); } }; f(std::integral_constant<int, 1>{}); } int main() { foo<int>(); } ここでライブ例。 それは簡単に置き換えることによって固定することが可能False<T>でFalse<decltype(x)>。 だから問題は:どのコンパイラーが正しいのか?の状態static_assertはに依存しているので、gccは正しいと思いますTが、よくわかりません。

1
C ++ 20テンプレートクラスのクラス外定義
C ++のC ++ 20標準までは、テンプレートクラスのいくつかのプライベートメンバーを使用するクラス外の演算子を定義する場合、次のような構成を使用していました。 template <typename T> class Foo; template <typename T> constexpr bool operator==(T lhs, const Foo<T>& rhs); template <typename T> class Foo { public: constexpr Foo(T k) : mK(k) {} constexpr friend bool operator==<T>(T lhs, const Foo& rhs); private: T mK; }; template <typename T> constexpr bool operator==(T …
12 c++  templates  c++20 

2
コンセプトを関数に渡す
概念はコンパイル時の述語として定義されているため、これらの述語をコンパイル時のアルゴリズムに実際に再利用することもできますか?たとえば、タプルのすべての型がコンセプトに準拠しているかどうかを確認することは可能でしょうか?私が見た限りでは、概念を関数に渡すことは決して不可能であり、そのため、これらの場合にテンプレートを使用することに戻ってきました。 #include <type_traits> template<typename T> concept FloatLike = std::is_same_v<T, float>; struct IsFloat { template<typename U> constexpr static bool test() { return FloatLike<U>; } }; template<typename Predicate, typename... T> constexpr bool all_types() { return (Predicate::template test<T>() && ...); } int main() { static_assert(all_types<IsFloat, float, float>()); static_assert(!all_types<IsFloat, float, int>()); } 私がやりたいのは次のようなものなので、それを使用できるようにするために常にコンセプトをラップする必要はありません。 template<concept …

1
このコードがg ++でコンパイルするのにとても時間がかかるのはなぜですか?
次のコードを検討してください。 template<int i> class A { typedef A<i-1> B; B x, y; }; template<> class A<0> { char m; }; int main() { A<LEVEL> a; } 次のBashコマンドでg ++によるコンパイルをベンチマークするとき(g ++ 8.3.0を使用) for ((level=1; level<30; ++level)); do echo -n ${level}, /usr/bin/time -f %U g++ -DLEVEL=$level test.cpp -o /dev/null done 次の出力が表示されます。 1,0.03 2,0.03 …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.