模板模式匹配
Template pattern matching
本文关键字:模式匹配 更新时间:2023-10-16
考虑这个类模板:
template <typename T1, typename T2, bool B>
class SomeClass { };
现在,我想提供两个基于 B==true
和 B==false
的实现。也就是说,我想说这样的话:
template <ANYTHING, ANYTHING, true> class SomeClass {
// First implementation
};
template <ANYTHING, ANYTHING, false> class SomeClass {
// Second implementation
};
如何在C++(11)中做到这一点?
部分专业化:
// primary
template<typename X, typename Bool>
struct Foo;
template<typename X>
struct Foo<X, std::true_type> {};
template<typename X>
struct Foo<X, std::false_type> {};
// use
Foo<X, std::true_type> x;
我使用类型包装器进行bool
,但您也可以使用非类型模板参数:
// primary
template<typename, bool>
struct Foo;
template<typename X>
struct Foo<X, true> {};
template<typename X>
struct Foo<X, false> {};
// use
Foo<X, true> x;
有时,您可以计算用于部分专用化的值在默认参数中使用元编程:
// primary
template<typename X, typename is_integral_ = std::is_integral<X>::type>
struct Foo;
这使得配置变量可由用户选择覆盖。
struct my {};
Foo<my, std::true_type> x;
为了防止这种情况,请通过继承调度:
// primary, where Foo_impl is any of the above
template<typename X>
struct Foo : public Foo_impl<X> {};
这称为部分专业化:
template <typename T1, typename T2> class SomeClass<T1 ,T2, true> {
// First implementation
};
template <typename T1, typename T2> class SomeClass<T1, T2, false> {
// Second implementation
};
顾名思义,它与(完全)专业化有关,如下所示:
template <> class SomeClass<int, char, false> {
// dedicated version for T1=int, T2=char, B=false
};
请注意,如果大多数实现相同,您还可以编写单个通用版本,其中只有依赖于 bool 参数的代码被委托给 trait 类。在这种情况下,trait 类将完全专注于单个参数。
相关文章:
- 模式匹配文本并提取C++中的数据
- 如何在CLIPS中优化不同模板事实之间的模式匹配
- Flex Lexer 模式匹配句子分隔符/标点符号作为 URL 路径部分
- C++中的模式匹配
- 模式匹配函数的时间测量无法正常工作
- C++向量的模式匹配
- 从.cpp文件中提取与模式匹配的"if"块
- 在某些情况下,通配符模式匹配失败
- 如何使用C++模板魔术来对类型进行模式匹配
- 使用 std::regex_search 获取与模式匹配的所有文件和文件夹
- 在 c++-17 中特化的模式匹配中 lambda 的拆分函数签名
- C++;仅当用户输入与预设模式匹配时才接受用户输入
- 下一个最大的整数,有一些中间位与模式匹配?
- 模板模式匹配
- 用于多个级联字符串的同步模式匹配算法
- 使用C++功能在系统路径中进行模式匹配
- 使用[msys]bash删除所有名称与模式匹配的文件,而不考虑文件名字母大小写
- DNA模式匹配中最快的算法是什么
- 使用后缀数组和 LCP(-LR) 实现字符串模式匹配
- 找到与另一个二进制模式匹配的所有 2 位值,然后对它们求和