模板函数,同时接受常量char*和常量std::string&;params 我正在研究一个项目,它本质上是一个包装C和C++ API的多个项目,它的目的是相同的。项目本身也有C和C++ API。因此,当我需要处理char*和std::string类型的字符串时,代码中有很多地方。 所以问题是如何方便有效地创建同时接受(const)char*和(const)std::string&type参数的模板函数?

模板函数,同时接受常量char*和常量std::string&;params 我正在研究一个项目,它本质上是一个包装C和C++ API的多个项目,它的目的是相同的。项目本身也有C和C++ API。因此,当我需要处理char*和std::string类型的字符串时,代码中有很多地方。 所以问题是如何方便有效地创建同时接受(const)char*和(const)std::string&type参数的模板函数?,c++,C++,例如,我想检查这两种类型的字符串是否为空,当然我想添加常量限定符,这样就可以清楚地知道我不会更改参数 到目前为止,我找到的最佳解决方案是: template<typename T> bool is_str_empty(T&); template<> bool is_str_empty(const char*& c) { return !c || strlen(c) == 0; } template<> bool is_str_empty

例如,我想检查这两种类型的字符串是否为空,当然我想添加常量限定符,这样就可以清楚地知道我不会更改参数

到目前为止,我找到的最佳解决方案是:

template<typename T>
bool is_str_empty(T&);

template<>
bool is_str_empty(const char*& c)
{
  return !c || strlen(c) == 0;
}

template<>
bool is_str_empty(std::string& s)
{
  return s.empty();
}
模板
布尔是空的(T&);
模板
布尔为空(常量字符*&c)
{
return!c | | strlen(c)==0;
}
模板
bool为空(std::string&s)
{
返回s.empty();
}
但正如你所能做的那样,我必须在没有常量限定符的情况下传递std::string,这样才能工作。我清楚地知道,在这种情况下,我只能重载函数,而根本不使用模板。但这不是一个很好的解决方案,尤其是当函数参数的数量增加时

例如,我还想编写如下模板函数:

template<typename T, typename K>
void assign_str(T, K)
模板
无效分配(T,K)
其中T可以是常量char*和常量std::string&(source)和K
char*或std::string&(dest)。因此,如果我只使用重载,那么头中的四个函数声明将取代一个模板函数。

为什么不使用重载函数代替模板???@VTT,我在帖子中提到了原因。当参数数量增加时,这不是有效的解决方案,但更重要的是——不优雅。@WhiZTiM,它是在c++17中添加的。理想情况下,我想要的解决方案可以由编译器以最大的c++11支持构建。但谢谢你的主意。为什么不直接用
std::string const&
作为参数,然后就可以了?它也应该接受字符常量*。