【问题标题】:How to hide a function based on a template parameter如何根据模板参数隐藏函数
【发布时间】:2010-06-24 04:03:35
【问题描述】:

我正在使用 Visual Studio 2008。我有这个课程:

template <bool T1>
class Foo {
public:
    void doSomething() {}

    Foo<T1>& operator=(int a) {
        doSomething();
        return *this;
    }
};

但如果模板参数T1 为假,我希望隐藏方法operator=(只需执行:return *this)。

对于 Foo 的实例,我需要它:

Foo<false> foo;
foo = 20; //this should give a compilation error

所以我尝试专门化类定义:

template<>
class Foo<false> {
private:
    Foo<false>& operator=(int a) {
        return *this;
    }
};

但是,通过这样做,我在 Foo&lt;false&gt; 的实例上丢失了方法 doSomething(),这不是我需要的。

我尝试使用 boost::enable_if 删除 operator=,如下所示:

typename boost::enable_if<
    boost::mpl::bool_<T1>
    , Foo<T1>
>::type&
operator=(int a) {
    callProxy();
    return *this;
}

但这让我无法参加如下课程:

class Bar {
public:
   Foo<true> assignable;
   Foo<false> unassignable;
};

我也试过将这两种方法都放在 Foo 中,然后用 boost::enable_ifboost::disable_if 删除它们,如下所示:

 template <bool T1>
 class Foo {
 public:
    void doSomething() {}

    typename boost::enable_if<
        boost::mpl::bool_<T1>
        , Foo<T1>
    >::type&
    operator=(int a) {
        doSomething();
        return *this;
    }

 private:
    typename boost::disable_if<
        boost::mpl::bool_<T1>
        , Foo<T1>
    >::type&
    operator=(int a) {
        return *this;
    }
 };

这也不起作用(我预料到了,但值得一试)。

那么,是否有可能获得我需要的行为,如果是,我该怎么做?

【问题讨论】:

  • 我很困惑为什么你需要这样的行为。 :)

标签: c++ templates


【解决方案1】:

为什么不使用常规的 if()?

if(T1) doSomething();

【讨论】:

  • 可以,但我需要在 Foo 的实例中调用 operator= 给我一个编译错误。
  • @Edison:所以...那么你的代码 class Bar { public: Foo&lt;true&gt; assignable; Foo&lt;false&gt; unassignable; }; 不应该工作。
  • 好的,然后添加 static int dummy[T1];在 operator= 的主体中,当 T1 为 false 时,数组大小将为零,这是不允许的。或者你可以使用 BOOST_STATIC_ASSERT。
  • 为什么不呢?我可以提供一个无操作运算符 =,就像我在专门使用 Foo 时所做的那样:template class Foo { private: Foo& operator=(int a) { return *this; } };
  • @Edison:那么,您想要编译错误还是无操作运算符?你必须下定决心。
【解决方案2】:

您可以静态断言条件:

Foo<T1>& operator=(int a) {
    BOOST_STATIC_ASSERT(T1);
    doSomething();
    return *this;
}

【讨论】:

    【解决方案3】:

    您可以对true 进行特殊处理,而不是对false 进行特殊处理,并且在这种情况下只包括operator=

    【讨论】:

    • 如果我这样做,以下代码将无法编译:class Bar { public: Foo assignable; Foo 不可赋值; };
    猜你喜欢
    • 2011-08-24
    • 2016-10-26
    • 2021-12-26
    • 2015-06-04
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多