Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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++模板专业化思考_C++_Template Specialization - Fatal编程技术网

C++模板专业化思考

C++模板专业化思考,c++,template-specialization,C++,Template Specialization,我遇到了一个奇怪的情况,应该用模板来解决,但由于某种原因,我没有找到正确的方法 对于最基本的类型int、bool、char、double、long。。。我使用此功能: template <typename T> T foo(T val); 所有基本类型的代码都是相同的,但是字符串大小写是特殊的,因为参数和返回值类型不同,并且字符串大小写需要的代码与基本大小写不同 我尝试了各种奇怪的组合来实现一个可以编译并工作的代码,但我失败了。 我需要一个比反复编写相同代码更优雅的解决方案 谢谢

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

对于最基本的类型int、bool、char、double、long。。。我使用此功能:

template <typename T>
T foo(T val);
所有基本类型的代码都是相同的,但是字符串大小写是特殊的,因为参数和返回值类型不同,并且字符串大小写需要的代码与基本大小写不同

我尝试了各种奇怪的组合来实现一个可以编译并工作的代码,但我失败了。 我需要一个比反复编写相同代码更优雅的解决方案


谢谢

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

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的类型为常量字符[4]。因此,这更适合字符串文本。

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

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的类型为常量字符[4]。因此,这更适合字符串文本。

而简单重载可能是首选std::string foocont 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);

如果仍然需要常量char*

则可以专门化,而简单重载可能是首选std::string foocont 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*

则可以专门化,如果删除模板,它应该可以工作吗?如果删除模板,partit应该可以工作吗?部分