假设我有以下代码:
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无法区分数据类型(与标准函数重载不同).
可能最好的方法是从定义识别您的类型的特征开始:
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>标题中已经提供了一些预定义的特征和实用程序.
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |