【发布时间】:2012-08-13 01:10:21
【问题描述】:
考虑以下代码:
template<typename T> class Base
{
Base();
Base(const Base<T>& rhs);
template<typename T0> explicit Base(const Base<T0>& rhs);
template<typename T0, class = typename std::enable_if<std::is_fundamental<T0>::value>::type> Base(const T0& rhs);
explicit Base(const std::string& rhs);
};
template<typename T> class Derived : Base<T>
{
Derived();
Derived(const Derived<T>& rhs);
template<class T0> Derived(const T0& rhs) : Base(rhs);
// Is there a way to "inherit" the explicit property ?
// Derived(double) will call an implicit constructor of Base
// Derived(std::string) will call an explicit constructor of Base
};
有没有办法重新设计这段代码,使Derived 的所有构造函数都具有相同的显式/隐式属性?
【问题讨论】:
-
继承的构造函数这样做。遗憾的是,它们尚未在我所知道的任何编译器上实现:(我很确定您可以手动执行此操作(可以轻松编写检测隐式/显式可构造性的特征,并且明智地使用 SFINAE 可以做到其余的),但我现在没有时间发布完整的答案。如果以后有时间时没有,我会这样做。
-
请注意,您的
Derived无法处理初始化列表。唯一适用于它们的解决方案是继承的ctors。
标签: c++ constructor c++11 explicit-constructor