non-type相关内容
我已经阅读了很多问题和答案,但是这个问题最吸引我的眼球;它及其答案很有帮助,但我仍然觉得我没有完全理解使用非类型模板参数背后的用途和理论.它们提供了许多关于何时使用它的有用示例,但没有一个真正阐明非类型模板参数背后的理论. 我感兴趣的不是在示例中具体是什么时候,而是更广泛地了解为什么我倾向于使用非类型模板参数而不是常规函数参数. 我知道它们是在编译时确定的,并且每个新调用都会创建一个新
..
考虑以下包含函数指针的类 S 和该类的以lambda初始化的 constexpr 对象 s : struct S{无效(* f)();};constexpr S s {[] {}}; 现在,如果我编写一个类型为 S 的非类型模板参数的模板 X ,并通过 s 实例化它,如下所示: template结构X {};使用x = X s; clang编译代码,但是gcc抱怨: 错误
..
我再次阅读"C ++ Primer,第5版".在有关模板的第16章中,有一个“模板非类型参数"示例: templateint compare(const char(& p1)[N],const char(& p2)[M]){返回strcmp(p1,p2);}int main(){cout
..
模板非类型参数的限制规则如下: 非类型,非模板模板参数的模板参数应为以下之一: -对于整数或枚举类型的非类型模板参数,该模板参数类型的转换常量表达式(5.19);或 -非类型模板参数的名称;或 -一个常数表达式(5.19),用于指定具有静态存储持续时间和外部或内部链接的对象的地址,或者具有外部或内部链接的函数的地址,包括函数模板和函数模板ID,但不包括非静态类成员,表示为(
..
根据引用,即非类型模板参数的名称即使分配默认值也是可选的(请参阅(1)和(2)).因此,这些模板结构是有效的: template struct Foo {}; template struct Bar {}; 我还没有看到访问非类型参数值的可能性. 我的问题是:未命名/匿名非类型模板参数有什么意义?为什么名称是可选的? 解决方案
..
以下代码合法吗? template struct A {}; int main(){ auto lmb = [](int i){return i * i;}; A一种; 返回0; } 我注意到g ++可以很好地编译,而clang ++返回 错误:非类型模板参数不能具有类型'((main.cpp:...处的la
..
我想使用部分模板特化,以便将数组(在编译时创建的)“分解”为一个由其值组成的参数包(以与我在代码中定义的其他结构进行交互)。以下(我的第一次尝试)未编译 #include 模板结构K; 模板结构K
..
以下代码段编译,在Clang 4.0中没有错误,但GCC 7.0生成了错误(请注意-std = c ++ 1z标志的使用)。 使用FuncT = int(*)(double); 模板 int temp_foo(double a) { return FUNC(a); } int foo(double a) { return 42; }
..
假设我有两个结构, Foo 和 Bar : template struct Foo {}; template struct Bar {}; 我想创建一个类型特征(称为 match_class )如果我通过两个 Foo 类型或两个 Bar 类型,但如果我尝试将它们混合使用则为
..
我已经阅读了许多问题和答案,但是此问题最吸引我的目光;它及其答案很有帮助,但我仍然觉得我不完全了解使用非类型模板参数的用途和理论.它们提供了许多有关何时使用它的有用示例,但没有一个真正揭示非类型模板参数背后的理论. 我有兴趣不专门了解示例中的时间,而更广泛地了解为什么我倾向于仅在常规函数参数上使用非类型模板参数. 我知道它们是在编译时确定的,并且每个新调用都会使用确定的非类型模板参数值
..
我无法定义和专门处理内部类外部 :: Inner 的成员函数 update() #include template struct Outer { struct Inner { enum类型{A,B,C}; template void update(); }; };
..
C ++允许非类型模板参数是整数或枚举类型(整数包括布尔值和字符),以及指针和任意类型的引用。 我已经看到整数,布尔和枚举参数广泛使用,我欣赏他们的实用程序。我甚至看到了对字符参数的巧妙使用,用于字符串的编译时解析。 / p> 但我想知道非类型模板参数的一些用例是指针或任意类型的引用? 解决方案 使用指针到成员函数作为模板参数,使编译器可以内联对该函数的调用。这个用法的一个例子
..
为什么非类型引用的模板参数不能是另一个引用(g ++ 4.8.1): template void test(){} int x = 5; int& p = x; int main(){ test(); // compiles fine test
(); //错误:无法将模板参数'p'转换为'int&'| } 我看
..
C ++允许非类型模板参数为指针,包括函数指针,类型。我最近询问了一个问题,了解此功能的用途,这是其中一个答案的后续步骤。 是否可以从函数指针的函数参数中推导出函数指针模板参数的值?例如: 使用VoidFunction = void(*)(); template void templ(VoidFunction); ... v
..
如果我们有一个模板函数,它接受类型 int 或 short 的非类型参数关于以下调用的模糊性: //定义 template void foo(){std :: cout void foo(){std :: cout
..
C ++范本的第4.3节 状态“不能使用 浮点文字(和简单的 常数浮点表达式) 作为模板参数具有历史 原因。' 同样, $ 14.1 /类型 模板参数不应该是 声明为浮点, 类或void类型。[示例: template class X; // error template class Y; // OK t
..
也许我累了,但是我坚持这个简单的部分专业化,这不工作,因为非类型模板参数专门化模板参数依赖类型'T': template struct X; template struct X 由 0 > T(0), T {0} 或(T)0 t帮助。 解决方案 请参阅[temp.class.spec
..