帮助模板专业化

Joh*_*ohn 4 c++ templates

我正在使用/学习模板功能专业化规则.我从这个功能开始

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)

我想为每个案例都有一个专业化的工作,但是很难搞清楚.

Lig*_*ica 6

为何专业化?只是重载功能.通常不需要完全专门化的功能模板.

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


Pup*_*ppy 6

它不起作用的原因是因为它实际上不是正确的类型.字符串文字不是类型const char*,它们是类型const char[N].当你传递一个字符串,则T被推断为是char[N].这是完全匹配,专业化不是.您不能指定字符串文字,因为这需要部分规范,C++不支持部分函数特化.