重载多个函数的简写

Lap*_*pys 2 c++ overloading

假设我有以下代码:

bool isString(char* arg) { return true; }
bool isString(const char* arg) { return true; }
bool isString(std::string arg) { return true; }

// Any other type...
template <typename type> bool isString(type arg) { return false; }
Run Code Online (Sandbox Code Playgroud)

问题是,C++是否允许任何合理的方式将下面的语法缩短为类似于下面的概念(语法简写/糖):

// Could be `char*`, `const char*` or `std::string` here.
bool isString([char*, const char*, std::string] arg) { return true; }

// Any other type...
template <typename type> bool isString(type arg) { return false; }
Run Code Online (Sandbox Code Playgroud)

这里给出的示例不一定用于检测字符串,而是用于解释多行代码专用于重载函数的问题.

想象一下,如果我必须测试100多种数据类型是否有效,我会很快想要一种更短的编码方式,而不是输入所有100个重载函数

当然,这种句法简写的缺点是arg无法区分数据类型(与标准函数重载不同).

Sto*_*ica 5

可能最好的方法是从定义识别您的类型的特征开始:

template<typename> struct is_string : std::false_type{};

template<> struct is_string<char*>       : std::true_type{};
template<> struct is_string<char const*> : std::true_type{};
template<> struct is_string<std::string> : std::true_type{};
Run Code Online (Sandbox Code Playgroud)

然后你可以做各种各样的事情.例如,在帖子中实现该功能就变成了这一点

template<typename T> constexpr bool isString(T) { return is_string<T>::value; }
Run Code Online (Sandbox Code Playgroud)

或者,如果要控制重载决策,并在参数不是我们查看的字符串时从重载集中删除函数:

template<typename S>
auto needAString(S s) -> std::enable_if_t<is_string<S>::value>;
Run Code Online (Sandbox Code Playgroud)

<type_traits>标题中已经提供了一些预定义的特征和实用程序.