Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为可以是char或string的模板类实现方法?_C++_Class_Templates - Fatal编程技术网

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)) {}
};