Я использую 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;
}
};
Что тоже не сработало (я ожидал этого, но стоило попробовать).
Итак, возможно ли получить нужное мне поведение, и если это так, как я могу это сделать?