特定值的c++模板专门化
C++ template specialization for specific values
我有一个结构体Opers
,它有一些算术运算:mult()
, div()
, mod()
。
我需要为n
的某些值特殊化模板。以下是Opers<1>
的示例。
但是,我还想对2的幂n
进行专一化(n = 2,4,8,16,…)-在这种情况下,我可以优化操作mult()
和div()
(使用位向左或向右移动)。
#include <iostream>
using namespace std;
template<int n> struct Opers {
int mult(int x){
return n*x;
}
int div(int x){
return x / n;
}
int mod(int x){
return x % n;
}
};
template<> struct Opers<1> {
int mult(int x){
return 1;
}
int div(int x){
return x;
}
int mod(int x){
return 0;
}
};
int main() {
Opers<1> el2;
cout << el2.mult(3) <<endl;
}
我在寻找像
这样的建筑template<> struct Opers<isPowerOfTwo()>
int mult(int x){
// do smth
}
有可能吗?我应该看什么手册?
乌利希期刊指南。使用c++ 11是允许的,甚至会更好。
在c++ 11中,可以这样做。首先,更改主模板,使其接受第二个虚拟参数:
template<int n, typename = void>
struct Opers
{
// ...
};
然后,写一个constexpr
函数来判断一个整数是否是2的幂:
constexpr bool is_power_of_two(int x)
{
return (x == 1) || ((x % 2 == 0) && is_power_of_two(x / 2));
}
最后,根据constexpr
函数的结果使用SFINAE来启用或禁用专门化:
#include <type_traits>
template<int n>
struct Opers<n, typename std::enable_if<is_power_of_two(n)>::type>
{
// ...
};
template <int N, typename = void>
struct Operations
{
// ....
};
template <int N, typename = std::enable_if<(N & (N - 1))>::type>
struct Operations
{
// ....
};
相关文章:
- 是否可以对零模板参数进行模板专门化
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 输入两个不专门化大小的矩阵
- 如何在模板类中专门化赋值运算符?
- 如何专门化容器和枚举的模板
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- 取消专门化C++模板参数
- SFINAE的变分变量模板专门化
- 如何在编译时专门化大型模板函数中的小部分
- 如何在c++运算符()中专门化调用模板
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何专门化字符串数组的模板?
- 如何专门化模板
- 如何避免为模板化迭代器的每个可能的实例化专门化iterator_traits?