我需要使用成员声明的条件。
template <bool> struct B;
template <> struct B<true> { void foo(); };
template <> struct B<false> { };
template <typename T>
struct A : public B<is_default_constructible<T>::value> {
using B<is_default_constructible<T>::value>::foo();
void foo(int) {}
};
这显然不起作用,因为在一半的情况下B<bool>::foo
没有定义。我怎么才能做到这一点呢?让B<>::foo()
在A<T>
作用域中foo(int)旁边可见?
2条答案
按热度按时间mu0hgdu01#
这是我的解决方案。我肯定这不是最好的,但它能完成任务。
struct A
应该包含您希望在这两种情况下定义的方法。在
B<false>
的情况下,仅定义了void foo(int)
。在B<true>
的情况下,同时定义了void foo(int)
和void foo()
。现在我不必担心在某些情况下没有定义
B<is_default_constructible<T>::value>::foo()
。hivapdat2#
使用专门化。
enable_if
不能用于此目的。您还需要专门化struct A
。避免foo(int)重复代码
如果
foo(int)
在这两种情况下具有相同的功能,您可能希望从另一个基本结构体派生它:去掉那个难看的bool
最后,要从
struct A
的模板参数中删除bool,您可能希望将选择foo
的重载的责任转发给基类。这还有一个好处,即不会为您可能希望添加的其他struct A
成员重复代码。