SFINAE 尝试使用布尔值给出编译器错误:"模板参数'T::value'涉及模板参数"
SFINAE tried with bool gives compiler error: "template argument ‘T::value’ involves template parameter"
我尝试使用bool
实现SFINAE(不像流行的void_
技巧):
template<typename T, bool = true>
struct Resolve
{
static const bool value = false;
};
template<typename T>
struct Resolve<T, T::my_value>
{
static const bool value = true;
};
目标是专门化那些在里面定义了static const bool my_value = true;
的类。如果它们被定义为false
或未定义,则不要专门化它。例如
struct B1 { // specialize Resolve for this case
static const bool my_value = true;
};
struct B2 { // don't specialize
static const bool my_value = false;
};
struct B3 {}; // don't specialize
当对B1
应用上述技巧时,它会给出编译错误:
Resolve<B1>::value;
错误:模板参数' T::my_value '涉及模板参数
我知道这可以通过其他方式实现。然而,我有兴趣知道,为什么它在这里给出编译器错误,它可以在这个代码本身解决吗?
实际上你所做的是被§14.5.4/9所禁止的,
技巧可以是在第二个模板参数中也使用类型,封装非类型值,如下所述:部分专门化的非类型实参表达式不能包含部分专门化的模板形参,除非实参表达式是一个简单标识符。
template<bool b> struct booltype {};
template<typename T, typename B = booltype<true> >
struct Resolve
{
static const bool value = false;
};
template<typename T>
struct Resolve<T, booltype<T::my_value> >
{
static const bool value = true;
};
现在它编译罚款
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 无法使用 auto 来参数化true_type来检测 T::value()
- "Any value" 对于 'const std::string&' 参数
- cmake -D <var>:<type>=<value> 参数"-D"是什么意思
- 瓦尔格林德对带有默认参数的变量进行"conditional jump on uninitialized value"
- 具有非类型参数的类模板的静态成员的 gdb "static field value has been optimized out"
- SFINAE 尝试使用布尔值给出编译器错误:"模板参数'T::value'涉及模板参数"
- const或ref或const ref或value作为setter函数的参数