2

我有一个带有布尔模板参数的类。该类将有几种方法,我需要专门研究类 bool 模板参数。有没有一种方法可以在不专门针对整个班级本身的情况下做到这一点?

下面的 Foo::bar() 是我的意思的一个例子,它不起作用,因为 std::is_same 适用于类型而不是值

谢谢。

template<bool Mode>
class Foo
{   
public:
template<bool M=Mode, typename std::enable_if<std::is_same<M,true>::value>::type * = 0>
void bar()
{
    std::cout << "true" << std::endl;
}

template<bool M=Mode, typename std::enable_if<std::is_same<M,false>::value>::type * = 0>
void bar()
{
    std::cout << "false" << std::endl;
}
4

3 回答 3

10

也许我遗漏了一些东西,但为什么不使用普通的好旧专业呢?

template <bool M>
struct base_template {
   void bar();
};

template <>
inline void base_template<true>::bar() { std::cout << "true\n"; }
template <>
inline void base_template<false>::bar() { std::cout << "false\n"; }
于 2013-05-13T19:23:22.370 回答
4

你不需要使用std::is_same. std::enable_if已经有一个布尔参数:

template <bool Mode>
class Foo
{   
    public:
        template <bool M = Mode, typename std::enable_if<M>::type* = nullptr>
        void bar()
        {
            std::cout << "true" << std::endl;
        }

        template <bool M = Mode, typename std::enable_if<!M>::type* = nullptr>
        void bar()
        {
            std::cout << "false" << std::endl;
        }
};

这是一个演示

于 2013-05-13T19:20:06.963 回答
2

你在正确的轨道上。直接使用模板参数即可:

template<bool M=Mode, typename std::enable_if<M == true>::type * = 0>
void bar()                                 //^^^^^^^^^^
{
    std::cout << "true" << std::endl;
}
于 2013-05-13T19:19:57.940 回答