Как скрыть функцию на основе параметра шаблона - PullRequest
0 голосов
/ 23 июня 2010

Я использую Visual Studio 2008. У меня есть этот класс:

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

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

Но я хочу, чтобы метод operator= был скрыт (просто путем: return *this), если параметр шаблона T1 имеет значение false.

Мне нужно это для экземпляров Foo, строки:

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

Поэтому я попытался специализировать определение класса:

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

Однако, делая это, я теряю метод doSomething() на экземплярах, которые Foo<false>, а это не то, что мне нужно.

Я попытался удалить operator= с boost :: enable_if, например:

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_if и boost::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;
    }
 };

Что тоже не сработало (я ожидал этого, но стоило попробовать).

Итак, возможно ли получить нужное мне поведение, и если это так, как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 23 июня 2010

почему бы просто не использовать обычный if ()?

if(T1) doSomething();

1 голос
/ 23 июня 2010

Вы можете статически утверждать условие:

Foo<T1>& operator=(int a) {
    BOOST_STATIC_ASSERT(T1);
    doSomething();
    return *this;
}
1 голос
/ 23 июня 2010

Вместо специального случая false вы можете использовать специальный случай true и включить в этом случае только operator=.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...