C ++ std :: enable_if在类模板中,用于成员函数

时间:2014-04-09 19:47:41

标签: c++ templates c++11

问题很简单。我有一个带有包含警卫的头文件和一个实现文件.impl。头文件包括实现文件。我想做以下事情:

标题文件:

template<size_t N>
class A
{
  void func();
};

.impl文件:

template<size_t N>
typename std::enable_if<(N <= 5), void>::type A<N>::func() { ... }

template<size_t N>
typename std::enable_if<(N > 5), void>::type A<N>::func() { ... }

但是我对std::enable_if还不错,似乎无法找到func的原型,因为我通过更改返回类型来更改函数签名。如何为用户提供界面的一个功能,我可以有不同的实现。

这实际上是MCU寄存器修改器,它在两个寄存器上运行,因为一个寄存器没有容量。我宁愿不在函数内部使用任何基于N的脏偏移,而是依赖于简单的结构。另外,我宁愿不使用帮助函数,如果没有它们,可能会使事情变得复杂。

2 个答案:

答案 0 :(得分:7)

您可以改为使用tag dispatching

template <size_t N>
class A
{
    void func()
    {
        do_func(std::integral_constant<bool, (N > 5)>{});
    }

    void do_func(std::true_type) { /* handles the N > 5 case */ }
    void do_func(std::false_type) { /* handles the N <= 5 case */ }
};

答案 1 :(得分:3)

您可以委派:

#include <iostream>

template<std::size_t N>
class A
{
    private:
    template <std::size_t I>
    typename std::enable_if<(I <= 5)>::type
    f() { std::cout << "Small\n"; }

    template <std::size_t I>
    typename std::enable_if<(I > 5)>::type
    f() { std::cout << "Big\n"; }

    public:
    void func() { f<N>(); }
};

int main()
{
    A<1> small;
    small.func();
    A<10> big;
    big.func();
}

如果您信任编译器优化:

template<std::size_t N>
class A
{
    private:
    void small() { std::cout << "Small\n"; }
    void big() { std::cout << "Big\n"; }

    public:
    void func() {
        if(N <= 5) small();
        else big();
    }
};