是否可以从构造函数中自动推导出基类模板参数?

时间:2018-06-06 14:55:55

标签: c++ templates c++17

此代码示例可以正常运行并完成它应该执行的操作。

template <typename T>
struct base {
    base(T a) {};
};

struct b : public base<int> {
    b() : base(3) {};
};

我想利用构造函数中带有自动扣除模板参数的C ++ 17特性,并执行以下操作:

struct b : public base { // note lack of <int>
    b() : base(3) {};
};

没有一些丑陋的黑客可以吗?

1 个答案:

答案 0 :(得分:12)

模板参数扣除规则不允许这样做。而且他们不太可能。考虑一下:

struct b : public base { // note lack of <int>
    b()    : base(3) {}
    b(int) : base(false) {}
};

现在b的基类是什么?有人可能会争辩说,如果基类的所有初始化都对类型达成一致,那么它是可行的。但是在实践中很难检查它(想想c&#t; tors所在的单独的目标文件),而且看起来IMO对于某个功能来说太有用了。

因此,总而言之,您无法避免为基类模板指定模板参数。