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;