模板参数推导C++
Template Argument Deduction C++
我尝试编译以下代码行,但失败了:
template <typename T>
struct InputBlockParameterType {
typedef T type;
};
template <typename T, template <typename> class BlockTypeTrait>
struct BlockParameterImpl {
typedef typename BlockTypeTrait<T>::type type;
};
template <typename T>
struct InputBlockParameter {
typedef typename BlockParameterImpl<T, InputBlockParameterType>::type type;
};
struct Functor {
template <typename T>
bool operator()(typename InputBlockParameter<T>::type p) {
return true;
}
};
int main() {
InputBlockParameter<double>::type arg = 0.0;
Functor f;
f(arg);
return 0;
}
错误是 (MSVC 2013(:
1>main.cpp(31): error C2783: 'bool Functor::operator ()(InputBlockParameter<T>::type)' : could not deduce template argument for 'T'
1> main.cpp(21) : see declaration of 'Functor::operator ()'
如果我将函子更改为
struct Functor {
template <typename T>
bool operator()(T p) {
return true;
}
};
一切都按预期编译良好。
为什么代码的第一个版本没有编译?它是标准中定义的某个地方吗?
演绎只适用于推导的上下文。
这是无用的:X只有在X工作时才有效。 我可以引用标准,但它只是在更难阅读的散文中说"是的,那行不通"。
考虑这个问题的最好方法是编译器只执行模式匹配。 但是,它不会搜索或尝试反转您编写的任何类型映射。
foo<T>::type
可以做一个图灵完备计算(达到编译器限制(从T
到type
:所以标准声明使用T
存在一个非推导的上下文,即使foo
类型映射看起来很容易反转给你。 反转任意函数并不是要求编译器做的一件实际的事情,即使我们已经要求它们为图灵完备才能编译C++。
编译器不会转换(除了基和 cv 剥离和参数衰减(,也不会在模板类型推断期间反转类型映射。 它只是模式与参数匹配。
它将遵循SFINAE目的的类型映射,但理论上要容易得多。
如果可以自己编写逆映射,则可以混合使用 SFINAE 和默认参数以及模板类专用化和转发来获得您可能想要的效果。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用