参数值相等时的模板专门化
Template specialization when parameter values are equal
我有一个形式为
的函数template<int a, int b>
void f();
当a == b时,我想专门化。伪代码看起来像:
template<int a>
void f<a, a>(){ //something}
template<int a, int b>
void f<a, b>(){ //something different}
这是否可能没有部分模板特化问题?
编辑:谢谢你的快速回复。这个方法实际上是在一个类的内部,更像这样:<typename a> class A{
template<int b, int c> f();
};
A inst;
inst.f<1,1>();
inst.f<1,2>();
不能部分专门化函数模板,但可以部分专门化类模板。
这为下面的技巧留下了空间,其中实际的工作是由主函数模板和专门化函数模板的静态成员函数完成的,您的原始f()
函数将其职责委托给它们:
#include <iostream>
namespace detail
{
template<int A, int B>
struct helper
{
static void call() { std::cout << "f<A, B>()" << std::endl; }
};
template<int A>
struct helper<A, A>
{
static void call() { std::cout << "f<A, A>()" << std::endl; }
};
}
template<int a, int b>
void f()
{
detail::helper<a, b>::call();
}
以下是f()
函数模板的使用方法:
int main()
{
f<1, 2>();
f<1, 1>();
}
下面是一个的实例。
编辑:如果你的函数模板是一个成员函数,事情会稍微复杂一些,但是上面列出的将函数模板部分特化变成类模板部分特化的解决方案仍然是可行的。
这是基于注释中提供的示例的操作方法。
首先,前向声明helper
类模板,并授予它的实例访问你的类模板A
的私有成员的权利(附加类型参数T
的作用将在一会儿变得清晰):
namespace detail
{
template<typename T, int A, int B>
struct helper;
}
template <typename a>
class A
{
public:
template<int b, int c>
void f();
private:
template<typename, int, int> friend struct detail::helper;
};
然后像前面那样定义helper
类模板和它的专门化,但是向call()
函数添加一个函数形参,该函数的类型必须用于操作调用原始成员函数f()
的类对象:
namespace detail
{
template<typename T, int A, int B>
struct helper
{
static void call(T* p) { std::cout << "f<A, B>()" << std::endl; }
};
template<typename T, int A>
struct helper<T, A, A>
{
static void call(T* p) { std::cout << "f<A, A>()" << std::endl; }
};
}
然后可以定义成员函数f()
,如下所示:
template<typename a>
template<int b, int c>
void A<a>::f()
{
detail::helper<A<a>, b, c>::call(this);
}
并最终这样使用:
int main()
{
A<int> inst;
inst.f<1,1>();
inst.f<1,2>();
}
这些都放在这个实例中
相关文章:
- 是否可以对零模板参数进行模板专门化
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 取消专门化C++模板参数
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何为特定数量的模板参数专门化可变参数模板结构
- 使用非类型模板参数进行专门化模板模板参数
- g++和clang++在结构/类专门化中具有非类型参数的不同行为
- 我如何避免使用依赖于参数的查找明确专门化模板化功能
- 专门化采用通用引用参数的函数模板
- 如果需要参数包,则使用SFINAE专门化类
- c++多参数模板化的类成员专门化
- C++11`using`关键字:专门化模板参数的模板别名
- 如何在没有参数的情况下专门化模板类
- 我可以用非模板类专门化一个可变模板模板模板参数吗
- 如何在C++中专门化 std::vector 的模板模板参数
- 按参数C++类型专门化重载构造函数
- 将“类型参数”与“非类型参数”(或相反)专门化
- 如何在非模板化类中专门化没有参数的模板化方法
- 在 C++ 中鸭子键入(通过其非类型模板参数的值专门化模板函数)
- 使用已推导的模板参数专门化模板成员函数