C++ 如何调用模板类型的正确构造函数?

C++ 如何调用模板类型的正确构造函数?,c++,class,c++11,templates,initialization,C++,Class,C++11,Templates,Initialization,在下面的代码中,如何使注释行与上面的行以相同的方式工作 我想让它成为一个通用代码,调用模板的合适构造函数类型 #包括 #包括 模板 结构类 { 类型数据; 类(类型数据):数据(数据){} }; int main() { a类=标准::字符串(“abc”); //b类=“abc”; std::cout使用直接初始化: Class<std::string> b("abc"); b类(“abc”); 使用(或统一初始化)初始化类的实例 Class<std::string>

在下面的代码中,如何使注释行与上面的行以相同的方式工作

我想让它成为一个通用代码,调用模板的合适构造函数
类型

#包括
#包括
模板
结构类
{
类型数据;
类(类型数据):数据(数据){}
};
int main()
{
a类=标准::字符串(“abc”);
//b类=“abc”;

std::cout使用直接初始化:

Class<std::string> b("abc");
b类(“abc”);
使用(或统一初始化)初始化
类的实例

Class<std::string> a{ std::string("abc") };  // works
Class<std::string> b{ "abc" };               // also works
Class a{std::string(“abc”)};//有效
b类{“abc”};//也可以工作
您可以使用。它可以工作,因为现在只使用一个用户定义的转换:

  • const char*
    std::string

如果您能够更改
类,您可以添加一个模板转换构造函数。然后您就可以按照示例中编写的方式编译注释行。但是,请注意,通常不建议在没有正当理由的情况下使用隐式转换,因为它们可能会导致难以发现的错误(参见)

实时代码

Class<std::string> b = "abc";
Class<std::string> b("abc");
// or
Class<std::string> b{"abc"};
#include <string>
#include <iostream>

template <typename Type>
struct Class
{
    Type data;
    Class(Type data) : data(data) { }

    template<typename Other>
    Class(Other other_data) : data(other_data) {}
};


int main()
{
    Class<std::string> a = std::string("abc");
    Class<std::string> b = "abc";
    Class<std::string> c = a;

    std::cout << b.data << std::endl;
    return 0;
}
using namespace std::literals;

Class<std::string> b = "abc"s;