如何匹配模板参数字符集
How to match set of template parameter characters
我正在使用Visual Studio 2013 RTM。
我正在尝试编写一个与多个字符之一匹配的可变参数模板。 递归情况很容易,但我正在努力编写基本情况。
template <char C, char... Cs>
auto char_match(char c) -> bool
{
return c == C || char_match<Cs...>(c);
}
我尝试了以下基本情况,但没有奏效。 我知道你可以用类模板做到这一点,而且我很确定你不能用函数模板做到这一点。
template <>
auto char_match(char c) -> bool
{
return false;
}
错误 C2912:"布尔char_match(字符)"的显式专用化不是函数模板的专用化
我也尝试在返回类型上使用 std::enable_if,但Microsoft不喜欢它。
template <char C, char... Cs>
typename std::enable_if<sizeof...(Cs) != 0, bool>::type char_match(char c)
{
return c == C || char_match<Cs...>(c);
}
template <char C, char... Cs>
typename std::enable_if<sizeof...(Cs) == 0, bool>::type char_match(char c)
{
return c == C;
}
错误 C2039:"类型":不是"std::enable_if"的成员
我将不胜感激任何关于如何完成这项工作的建议。
没有比主模板更专业的"专业化"了,所以这是行不通的。我认为最简单的解决方案是使用类模板:
template <char ...> struct char_match_impl;
template <> struct char_match_impl<>
{
static bool go(char) { return false; }
};
template <char C, char ...Cs> struct char_match_impl<C, Cs...>
{
static bool go(char c) { return c == C || char_match_impl<Cs...>::go(c); }
};
template <char ...Cs>
bool char_match(char c)
{ return char_match_impl<Cs...>::go(c); }
在您的特定情况下,没有递归的理由,只需使用
template< char... Cs >
bool char_match( char c )
{
constexpr const std::array< char, sizeof...( Cs ) > a {{ Cs... }};
return std::find_if(std::begin(a), std::end(a),
[c](char x){return x==c;}) != std::end(a);
}
不确定VC++是否会接受代码,但GCC和Clang会接受。
现场示例
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何匹配模板参数字符集