Questions tagged «templates»

template标记用于多种环境:通用编程(尤其是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针对以下所有专业定义一次成员函数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 

3
可变参数模板:组中展开参数
我有一个带有两个参数的函数: 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, …

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 } 我知道我可以通过在类中使其成为T&来使'ptr'成员成为对指针的引用,但是我想知道是否可以通过传递给模板参数的参数来实现。
15 c++  templates 

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 等等。我知道我是否例如运行代码get 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 …
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 

1
模板类中struct的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); 该错误是由模板类foo引起的。当写<=而不是<1时,它也会编译。 任何提示表示赞赏吗? CompilerExplorer链接https://godbolt.org/z/v6Tygo

3
仅对定义了功能的类型在功能模板内执行功能
我有一个函数模板,它接受许多不同的类型。在这些类型中,只有其中一种具有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 …

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; } 这通常可以按预期工作,但有时即使两个结构实例具有相同的成员(我已经使用eclipse调试器进行了检查),它有时仍返回false。经过一些搜索,我发现memcmp由于填充了所使用的结构而导致失败。 有没有比较合适的内存填充方式?我无法修改所使用的结构(它们是我正在使用的API的一部分),并且所使用的许多不同结构具有一些不同的成员,因此无法以一般方式进行单独比较(据我所知)。 编辑:不幸的是,我坚持使用C ++ 11。应该早些提到...

2
如果constexpr在lambda中带有static_assert,哪个编译器正确?
当我们要在中使用时static_assert,if constexpr必须使条件取决于某些模板参数。有趣的是,当代码包装在lambda中时,gcc和clang不同意。 以下代码使用gcc进行编译,但是clang触发断言,即使if constexpr不能为true。 #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)>。 所以问题是:哪个编译器正确?我认为gcc是正确的,因为中的条件static_assert取决于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 ++ 8.3.0)对g ++编译进行基准测试时 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 …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.