我正在尝试创建一个应该从其他类继承构造函数但不从这些类本身继承的类。
在我的类的初始化过程中,我想使用完美转发来创建一个其构造函数与给定参数匹配的类型的对象。
除了没有参数的默认构造函数外,不应有歧义。
这是我的代码:
#include <string>
using namespace std;
//NOTE: this class is just an example to demonstrate the problem
class String {
public:
//default constructor to prevent ambiguity
String() {}
//construct from wstring
template<typename... Args>
String(enable_if<is_constructible<wstring, Args...>::value, Args>::type&&... args) : ws(forward<Args>(args)...) {}
//construct from string
template<typename... Args>
String(enable_if<is_constructible<string, Args...>::value, Args>::type&&... args) : s(forward<Args>(args)...) {}
private:
string s;
wstring ws;
};
void foo(const String& string) {
}
int main()
{
foo(L"123");
foo("123");
return 0;
}
我尝试了很多东西,但我就是无法让它发挥作用。
- 在目前的方法
enable_if
中无法自动扣除模板args(我认为) - 由于我使用构造函数,因此无法
enable_if
在返回值上使用 - 添加另一个默认参数
enable_if
将不起作用,因为构造函数是可变参数 - 当我
enable_if
从函数参数中删除时,编译器会抱怨无效的重载(当然)
有没有优雅的方法来解决这个问题?
编辑: 标准允许的一种隐式转换不应该发生在我的课堂上。[示例代码编辑]
与上述示例一起使用的一种解决方案是定义一个可变参数构造函数并将参数完美地转发给条件初始化函数。但是,我想避免这种开销,因为成员需要默认构造,这在其他情况下可能不起作用。
(如果事情可以更清楚,请随时编辑问题)