选择性启用Template类功能

时间:2011-01-03 01:31:40

标签: c++ templates

我有一个模板类,其中我有一个正常的功能。但我想只为模板类的某些实例化启用此正常函数。我看了一下boost :: enable_if,它并不完全符合我的需要/可能是我无法使用它来满足我的需要。

typedef boost::mpl::vector< bool, int, double >  CheckTypes;

template<class X>
class P
{
    void init( int x, 
       typename boost::enable_if< boost::mpl::contains<CheckTypes, X> >::type* dummy = 0);
};

有人可以帮忙解决这个问题吗?重要的是,解决方案不应该从调用代码中得到任何结果。并且该类被明确地实例化。

谢谢, 戈库尔。

2 个答案:

答案 0 :(得分:2)

enable_if通常用于区分函数的不同定义。从某种意义上说,它是一种更强大的重载方式。

似乎您只是在条件成立时才尝试启用函数,否则发出编译错误,因为您只有{{1}的单一定义}。如果这是正确的,您可能想要查看init(或c ++ 0x中的BOOST_STATIC_ASSERT)。

答案 1 :(得分:2)

一种选择是使用静态断言。模板类的成员函数是懒惰地实例化的,这意味着如果它们从未被调用,则不会生成它们的代码。这意味着你可以照常编写函数,期望它只会被调用bool,int或double的实例化,然后在这个函数中插入一个静态断言来检查确实是这种情况。 / p>

另一方面,如果您因为明确地实例化模板而无法执行此操作,则另一个选项可能是为包含额外成员函数的三种类型提供模板特化。这将允许您明确包含或排除该函数,但可能需要一些额外的编码。

或者,您可以考虑使此额外函数不是类的成员函数,而是自由函数。例如,考虑定义三个如下所示的函数,而不是仅存在这两个函数的init函数:

void Init(P<int>& toInit);
void Init(P<double>& toInit);
void Init(P<bool>& toInit);

这样,可能无法为任意类型编译的代码不在通用类本身中,而是散布到这些函数中。然后,您可以根据一些本身就是模板的辅助函数来实现这三个函数。