用户定义的非类型参数解决方法
User Defined Non-Type Parameter Workaround
不久前,我了解到您可以将文字传递到模板中,如下所示:
template <int x>
class myClass { };
//Later
myClass<12> var;
现在我已经定义了自己的 int 类型,并希望用它做同样的事情......但事实证明这是一个令人头疼
的问题我正在努力实现...像这样:
class myIntType;
template <myIntType val>
class Other{
};
不幸的是,这是非法的:(
所以另一个机会是不是给出一个实际的实例,而是传递一个将返回一个实例的函数(因为无论如何这是一个整数类型......所以我们不在乎两个实例是否实际上是同一个实例):
template<myIntTypeT(*Val)()>
class Other{
};
然后你像这样使用它:
constexpr myIntType foo() { return 12_mit; }
//_mit operator returns a myIntType var
Other<foo> other;
这种方法有几个缺点:
Other<foo>
和Other<bar>
是不同的类型,即使bar
镜像foo
给出的任何内容(我可以接受)- 这是非常不优雅的(这个我不太好)
不幸的是,这是一个非常笨拙的用途。 所以我的下一个尝试是获取一个 lambda 函数并将其放入模板中:
Other<[](){ return 12_mit; }> other;
但这失败了,因为 lambda 不是constexpr
s....
那么,是否有另一种更优雅的解决方案将用户定义类型的实例传递到模板中?
一种选择是对MyIntType
实例的引用作为模板参数传递:
class MyIntType {
public:
MyIntType () {}
};
template <const MyIntType & val>
class Other {};
const MyIntType foo;
int main () {
Other<foo> other;
}
另一种选择是将指向MyIntType
实例的指针作为模板参数传递:
class MyIntType {
public:
MyIntType () {}
};
template <const MyIntType * val>
class Other {};
const MyIntType foo;
int main () {
Other<&foo> other;
}
请注意,在这些简单示例中,MyIntType
的构造函数不需要constexpr
。
根据C++标准(第 14.3.2 节,第 1 条):
非类型、非模板模板参数的模板参数应为以下参数之一:
对于整型或枚举类型的非类型模板参数,模板参数类型的转换常量表达式 (5.19);或
非类型模板参数的名称;或
一个常量表达式 (5.19),它指定具有静态存储持续时间和外部或内部链接的完整对象的地址,或具有外部或内部链接的函数,包括函数模板和函数模板 ID,但不包括非静态类成员,表示(忽略括号)为
&
id 表达式,其中id 表达式是对象或函数的名称,但如果名称引用函数或数组,则可以省略&
,如果相应的模板参数是引用,则应省略;或计算结果为 null 指针值 (4.10) 的常量表达式;或
计算结果为 null 成员指针值 (4.11) 的常量表达式;或
指向 5.3.1 中所述的成员的指针;或
类型
std::nullptr_t
的常量表达式。
上述示例属于以下类别:
一个常量表达式,它指定具有静态存储持续时间和外部或内部链接的完整对象的地址。
- 有没有办法在 c++ 中同时生成随机数?如果没有,是否有解决方法?
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 是否有解决方法可以在 c++ 中为 short 定义用户定义的文字?
- 不为 emplace() 定义构造函数的解决方法
- 删除复制构造函数的 Intel 13.1.2 中不良C++行为的解决方法
- 函数模板部分专业化-有什么解决方法吗
- 带boost的过载模糊性:可选,解决方法
- 继承构造函数和其他变量的解决方法
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 对前向声明类型进行unique_ptr的解决方法
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 解决方法:QPixmap:在GUI线程之外使用pixmap是不安全的
- CreateProcessWithTokenW 的 cmdline 参数的最大长度是否有解决方法?
- C++双精度作为模板参数的解决方法
- 在参数相关查找之前进行模板替换的任何方法(或解决方法?
- CUDA 内核"Only a single pack parameter is allowed"解决方法?
- dlsym() 解决方法返回类型
- VS2017是否有VLA(可变长度阵列)支持解决方法
- 解决方法:未定义对"class::function"的引用
- 来自 Boost 的 JSON 解析器的警告 C4512 的解决方法