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

C++ std::enable_if in a class template, for a member function

本文关键字:if 用于 成员 函数 enable C++std      更新时间:2023-10-16

问题很简单。我有一个包含保护的头文件和一个实现文件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的脏偏移,而是依赖于普通结构。此外,我宁愿不使用辅助函数,如果没有它们的话,这会使事情变得复杂。

您可以使用标签调度:

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 */ }
};

您可以委托:

#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 << "Smalln"; }
    template <std::size_t I>
    typename std::enable_if<(I > 5)>::type
    f() { std::cout << "Bign"; }
    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 << "Smalln"; }
    void big() { std::cout << "Bign"; }
    public:
    void func() {
        if(N <= 5) small();
        else big();
    }
};