【问题标题】:c++ class member function specialization on bool valuesc++ 类成员函数特化 bool 值
【发布时间】:2013-05-13 19:16:21
【问题描述】:

我有一个带有布尔模板参数的类。该类将有几种方法,我需要专门研究类 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;
}

【问题讨论】:

  • std::is_same 比较类型M 是一个常量,truefalse 是值,即它们不是类型。

标签: c++ c++11


【解决方案1】:

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

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"; }

【讨论】:

  • 是的,我想我可以。我想如果我想专门化一个类,我必须在专门化的类中重新实现所有方法,我发现事实并非如此。也就是说,我认为 enable_if 代码看起来更简洁,也更不稳定,因为函数的声明也声明了专门化的意图。
  • @MK.:是吗?您正在创建不同的重载,虽然它们可以通过 SFINAE 神奇地消失,但您必须小心使用的条件(即 SFINAE 检查必须提供不相交的参数集,否则会出现歧义错误)。同时,因为它们是不相关的基本模板,没有任何东西将一个接口绑定到另一个接口,因此您可能会误认为其中一个定义中的参数/返回值......这不是专业化,但是重载.
【解决方案2】:

您不需要使用std::is_samestd::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;
        }
};

这是demo

【讨论】:

    【解决方案3】:

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

    template<bool M=Mode, typename std::enable_if<M == true>::type * = 0>
    void bar()                                 //^^^^^^^^^^
    {
        std::cout << "true" << std::endl;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-24
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      相关资源
      最近更新 更多