c++模板专门化思考

C++ Templates Specialization Ponderings

本文关键字:专门化 c++      更新时间:2023-10-16

我遇到了一个奇怪的情况,应该用模板来解决,但由于某种原因,我没有找到正确的方法。

对于大多数基本类型(int, bool, char, double, long…),我使用这个函数:

template <typename T>
T foo(T val);

特殊情况是字符串,因为在所有情况下向函数发送参数都是通过发送引号文本(如"blah"),该文本被推导为const char*,返回值必须是std::string,如下所示:

template ?
std::string foo(const char* val);

所有基本类型的代码都是相同的,但string的情况是特殊的,因为参数和返回值类型不相同,字符串情况需要与基本情况不同的代码。

我尝试了各种奇怪的组合来实现一个代码编译和工作,但我失败了。我需要一个比一遍又一遍地写同样的代码更优雅的解决方案。

谢谢!

只需添加一个非模板化的重载:

std::string foo(const char* str)
{
      return foo(std::string{str});
      //or
      // return foo<std::string>(str);
}
std::string foo(char* str); // might need this too

根据您的情况,您可以首先考虑(或相反):

template <std::size_t N>
std::string foo(const char(&str)[N])
{
    return foo(std::string{str});
    //or
    // return foo<std::string>(str);
}

字符串字面值是数组类型,但会衰变成指针。如。"asd"的类型为const char[4]。所以这更适合字符串字面值

虽然简单的重载可能是首选(std::string foo(const char* val);),但您可以为返回类型使用一种特征:

template <typename T>
struct fooRet
{
    using type = T;
};
template <>
struct fooRet<const char*>
{
    using type = std::string;
};

template <typename T>
typename fooRet<T>::type foo(T val);

可以专门用于const char*