c++模板专门化思考
C++ Templates Specialization Ponderings
我遇到了一个奇怪的情况,应该用模板来解决,但由于某种原因,我没有找到正确的方法。
对于大多数基本类型(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*
相关文章:
- 是否可以对零模板参数进行模板专门化
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 输入两个不专门化大小的矩阵
- 如何在模板类中专门化赋值运算符?
- 如何专门化容器和枚举的模板
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- 取消专门化C++模板参数
- SFINAE的变分变量模板专门化
- 如何在编译时专门化大型模板函数中的小部分
- 如何在c++运算符()中专门化调用模板
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何专门化字符串数组的模板?
- 如何专门化模板
- 如何避免为模板化迭代器的每个可能的实例化专门化iterator_traits?