我正在试验 C++11 的新特性。在我的设置中,我真的很想使用继承构造函数,但不幸的是还没有编译器实现这些。因此,我试图模拟相同的行为。我可以这样写:
template <class T>
class Wrapper : public T {
public:
template <typename... As>
Wrapper(As && ... as) : T { std::forward<As>(as)... } { }
// ... nice additions to T ...
};
这工作......大部分时间。有时使用Wrapper
类的代码必须使用 SFINAE 来检测如何Wrapper<T>
构造这样的类。然而,存在以下问题:就重载决议而言,构造函数将接受任何参数——但如果无法使用这些参数构造类型Wrapper<T>
,则编译将失败( SFINAE未涵盖这一点) 。T
我试图使用有条件地启用构造函数模板的不同实例化enable_if
template <typename... As, typename std::enable_if<std::is_constructible<T, As && ...>::value, int>::type = 0>
Wrapper(As && ... as) // ...
只要:
T
is的适当构造函数public
T
不是抽象的
我的问题是:如何摆脱上述两个约束?
我试图通过检查(使用 SFINAE 和sizeof()
)来克服第一个表达式new T(std::declval<As &&>()...)
是否在 Wrapper<T>
. 但这当然行不通,因为派生类可以使用其基类的受保护构造函数的唯一方法是在成员初始化列表中。
对于第二个,我完全不知道——它是我更需要的一个,因为有时它Wrapper
实现了 的抽象函数T
,使其成为一个完整的类型。
我想要一个解决方案:
- 根据标准是正确的
- 适用于任何 gcc-4.6.*、gcc-4.7.* 或 clang-3.*
谢谢!