gpt4 book ai didi

c++ - 如何使用 std::enable_if 有条件地选择可变参数构造函数?

转载 作者:IT老高 更新时间:2023-10-28 23:21:44 28 4
gpt4 key购买 nike

我正在尝试创建一个应该从其他类继承构造函数但不从这些类本身继承的类。

在我的类初始化期间,我想使用完美转发来创建一个类型的对象,其构造函数与给定参数匹配。

除了没有参数的默认构造函数外,不得有歧义。

这是我的代码:

#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 时,编译器会提示无效重载(当然)

有没有优雅的方法来解决这个问题?

编辑:标准允许的一种隐式转换不应该发生在我的类里面。 [编辑的示例代码]

与上述示例一起使用的一种解决方案是定义一个可变参数构造函数并将参数完美地转发给条件初始化函数。但是,我想避免这种开销,因为成员需要默认构造,而这在其他情况下可能不起作用。

(如果事情可以更清楚,请随时编辑问题)

最佳答案

我无法理解问题和解决方案。如果我想为方法或构造函数使用 2 种不同的类型,我可以简单地编写这两种类型。因此,无需使用 SFINAE 模板!这可以简单地通过特化来完成。

class A 
{
public:
template <typename ... Args>
A(const wstring &, Args ... );

template <typename ... Args>
A(const string &, Args ...);
};

拥有一个仅与一种类型完全匹配的模板在语义上并不是一个真正的模板:-)

阅读您的评论后,我得到了这个解决方案:

class foo
{
public:
template <typename ... Args>
foo( const string &&x, Args ... ) { cout << "Using string" << endl; }

template <typename ... Args>
foo( const wstring &&x, Args ...) { cout << "Using wstring" << endl; }
};

int main()
{
foo("123");
foo(L"123");

foo("123", 1);
foo(L"123", 1.11);
return 0;
}

并且按预期返回:

Using string
Using wstring
Using string
Using wstring

关于c++ - 如何使用 std::enable_if 有条件地选择可变参数构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19477322/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com