【发布时间】: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<false> 的实例上丢失了方法 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_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;
}
};
这也不起作用(我预料到了,但值得一试)。
那么,是否有可能获得我需要的行为,如果是,我该怎么做?
【问题讨论】:
-
我很困惑为什么你需要这样的行为。 :)