C++ 如何为可以是char或string的模板类实现方法?
我有这门课C++ 如何为可以是char或string的模板类实现方法?,c++,class,templates,C++,Class,Templates,我有这门课 template <typename T> class B{ T x; public: B(char c){ if(typeid(x)==typeid(char)) x=c; else{ string h; for(int i=0;i<10;i++) h.push_back(c); x=h; } } }; 这是一个示例类,
template <typename T>
class B{
T x;
public:
B(char c){
if(typeid(x)==typeid(char)) x=c;
else{
string h;
for(int i=0;i<10;i++) h.push_back(c);
x=h;
}
}
};
这是一个示例类,如果x的类型是char,我希望x=c,如果x是字符串,我希望x为[c]^10
然后我尝试创建两个对象:
int main(){
B<string> a('f');
B<char> b('g');
}
当i对象b被实例化时,编译器在第10行生成一个错误:
[Error] cannot convert 'std::string {aka std::basic_string<char>}' to 'char' in assignment
我知道这个错误是因为您不能将字符串分配给字符,但我需要完成任务,我该怎么做?对于C++17,您可以使用if constexpr:
对于C++17,您可以使用if constexpr:
如果x的类型是char,我希望x=c;如果x是字符串,我希望x为[c]^10
一种方法是创建一个返回正确对象的函数模板
// Declare the function template.
template <typename T> T make_data(char c);
Define specializations of the function template.
template <> char make_data<char>(char c)
{
return c;
}
template <> make_data<std::string>(char c)
{
return std::string(c, 10);
}
如果x的类型是char,我希望x=c;如果x是字符串,我希望x为[c]^10
一种方法是创建一个返回正确对象的函数模板
// Declare the function template.
template <typename T> T make_data(char c);
Define specializations of the function template.
template <> char make_data<char>(char c)
{
return c;
}
template <> make_data<std::string>(char c)
{
return std::string(c, 10);
}
在C++17之前,这似乎是最简单的可能性: 包括 样板 B类{ tx; 公众: bcharc; }; 样板 B::Bchar c:xc{} 样板 B::Bchar c:xstd::stringc,10{} int main{ B a'a'; B'B'; //B c'c';//链接器错误 }
在C++17之前,这似乎是最简单的可能性: 包括 样板 B类{ tx; 公众: bcharc; }; 样板 B::Bchar c:xc{} 样板 B::Bchar c:xstd::stringc,10{} int main{ B a'a'; B'B'; //B c'c';//链接器错误 }
简单的老式模板专门化: 样板 B类 { tx; 公众: 显式bcharc:xc {} }; 样板 B::Bchar c:x10,c {}
简单的老式模板专门化: 样板 B类 { tx; 公众: 显式bcharc:xc {} }; 样板 B::Bchar c:x10,c {}
如果你在C++17,std::is_same_v也可以使用。如果你在C++17,std::is_same_v也可以使用。这看起来更像是两个不同的类而不是一个模板。如果T不是字符而不是std::字符串,该怎么办?@MarekR:template不必处理所有类型,即使是std::uniform\u real\u发行版也只能处理float/double/long-double。@Jarod42我知道模板正在使用duck类型。问题的更多细节可能导致更合适的解决方案。这看起来更像是两个不同的类而不是一个模板。如果T不是char,也不是std::string,该怎么办?@MarekR:template不必处理所有类型,即使是std::uniform\u real\u发行版也只能处理float/double/long-double。@Jarod42我知道模板正在使用duck类型。问题的更多细节可以导致更合适的解决方案。我无法定义更多的函数、方法或方法members@GuglielmoLaMastra,这是一个相当不寻常的限制。至少要知道,当你在外面的时候,这样的约束是不可能被强加的。我不能定义更多的函数、方法或规则members@GuglielmoLaMastra,这是一个相当不寻常的限制。至少要知道,当你不在世界上时,这样的限制不太可能被施加。如果你使用-std=C++17作为编译器标志指定C++17(假设你的编译器支持C++17),那么得票最多的也会起作用。我提出这个问题是因为你的陈述暗示C++17解决方案不起作用;是的。但是,实际指定标准是由您自己决定的。如果您使用-std=C++17作为编译器标志指定C++17,那么如果您的编译器支持C++17,那么得票最高的也会起作用。我提出这个问题是因为你的陈述暗示C++17解决方案不起作用;是的。不过,具体的标准取决于你。
template <typename T>
class B
{
T x;
public:
B(char c) : x(make_data<T>(c)) {}
};