我正在使用/学习模板功能专业化规则.我从这个功能开始
template<typename T>
std::string toString(const T& t)
{
ostringstream out;
out << t;
return out.str();
}
Run Code Online (Sandbox Code Playgroud)
现在我想把它专门用于const char*
typedef const char* ccharPtr;
template<>
std::string toString(const ccharPtr& s)
{
cout << "in specialization" << endl; // just to let me know
return std::string(s);
}
Run Code Online (Sandbox Code Playgroud)
我想在没有typedef的情况下这样做,但到目前为止我无法理解.
该特化适用于const char*,但不适用于char*.
const char* s1 = "Hi"
cout << toString(s1); // works
char s2[] = "There";
cout << toString(s2); // doesn't work, since s2 isn't const char*
cout << toString(", Bob"); // doesn't work. Why not?
Run Code Online (Sandbox Code Playgroud)
我想为每个案例都有一个专业化的工作,但是很难搞清楚.
为何专业化?只是重载功能.通常不需要完全专门化的功能模板.
template <typename T>
std::string toString(const T& in)
{
ostringstream out;
out << in;
return out.str();
}
std::string toString(char const* in)
{
return in;
}
Run Code Online (Sandbox Code Playgroud)
好吧,如果你真的想这样做,那么你必须考虑字符串文字的类型 - 尽管它们隐式转换为char const*- 是char const[N].
template <typename T>
std::string toString(T const & t) {
ostringstream out;
out << t;
return out.str();
}
template <>
std::string toString(char const* const & s) {
cout << "(S1)";
return std::string(s);
}
template <size_t N>
std::string toString(char (&s)[N]) {
cout << "(S2)";
return std::string(s);
}
template <size_t N>
std::string toString(char const (&s)[N]) {
cout << "(S3)";
return std::string(s);
}
int main() {
const char* s1 = "Hi";
cout << toString(s1) << endl;
char s2[] = "There";
cout << toString(s2) << endl;
cout << toString(", Bob") << endl;
}
// Output:
// (S1)Hi
// (S2)There
// (S3), Bob
Run Code Online (Sandbox Code Playgroud)
您可以省略专业化S2,然后都"There"和", Bob"会使用S3.
请注意,实际上,这根本不是专业化的.我宁愿通过创建新的功能模板来欺骗.但我必须得到size_t参数; 如果你选择了一个值并将其作为具体类型的一部分写入函数签名,或者如果你可以部分地专门化函数模板,那么你只能在这里做真正的专业化.N
它不起作用的原因是因为它实际上不是正确的类型.字符串文字不是类型const char*,它们是类型const char[N].当你传递一个字符串,则T被推断为是char[N].这是完全匹配,专业化不是.您不能指定字符串文字,因为这需要部分规范,C++不支持部分函数特化.
| 归档时间: |
|
| 查看次数: |
1469 次 |
| 最近记录: |