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