成员变量中的类模板参数扣除
Class Template Argument Deduction in member variables
在此处展开版本。
我们可以创建具有默认模板参数的类模板的对象,而无需键入角度括号:
int main()
{
std::less a;
}
,但我们不能为成员变量这样做:
struct S
{
std::less a; // I want only type std::less<void> here
};
看起来第一种情况是由于CTAD而起作用的,但是为什么编译器在第二种情况下不能推断std::less<void>
?也许我们不应该在那里应用CTAD,而应该提供不同的机制。
这是标准中的错误吗?是否有修复它的建议?
我的用例:
我有一个类模板,可提供默认参数,例如:
template <typename T = int>
class Foo {};
模板参数是我自己从未使用过的专家功能,但对于那些想要完全灵活性的专家来说,它是在那里。现在,对于其他99%的人,我想隐藏Foo
实际上是类模板的事实,但是它不起作用,因为用户将其声明为成员变量时必须键入Foo<>
,当前解决方案是:
template <typename T = int>
class BasicFoo {};
using Foo = BasicFoo<>;
但它使实施代码复杂化,根本不是优雅。
不,这不是错误。这是因为可能有不同的构造函数要求相同的成员变量(通过类的构造器init列表来称呼),可能会产生不同的扣除结果。
为了防止这种冲突的潜力,您必须向非静态成员提供模板参数。(静态成员不是问题,因为会有一个构造函数来调用它们)
相关文章:
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 扩展可变参数模板中的变量名称
- 在类构造函数中定义结构变量的参数
- 带有整数的变量参数列表
- 转发变量参数列表以模拟 std::thread
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- 存储稍后要转发的变量参数
- C++具有模板成员变量的类. 和参数内存输出
- 我应该如何在没有变量的情况下将相同的参数传递给 CMAKE 中的多个目标?
- 为变量模板的每个参数调用模板函数
- 具有推导参数的模板函数指针数组变量
- 函数参数变量总是需要 & 或 * 运算符吗?
- 为什么 beginthreadex 线程参数变量在父线程中没有更新
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 如何在函数中使用非参数变量?
- 即将将引用作为函数中的参数传递以更改参数变量的值
- 基于不断变化的参数/变量的XML get值
- cocos2d-x v3 CallFunc作为参数/变量如何
- 在编译时使用c++元编程中的运行时参数(变量)
- 我可以返回一个非参数变量吗?