【发布时间】:2011-03-30 08:13:53
【问题描述】:
在尝试回答 this question 时,我想建议使用 enable_if + disable_if 以允许基于类型是(或不是)多态的事实重载方法。
所以我创建了一个小测试文件:
template <class T>
void* address_of(T* p,
boost::enable_if< boost::is_polymorphic<T> >* dummy = 0)
{ return dynamic_cast<void*>(p); }
template <class T>
void* address_of(T* p,
boost::disable_if< boost::is_polymorphic<T> >* dummy = 0)
{ return static_cast<void*>(p); }
struct N { int x; };
int main(int argc, char* argv[])
{
N n;
std::cout << address_of(&n) << std::endl;
return 0;
}
这看起来很温顺。
但是 gcc (3.4 ...) 对此感到窒息:
test.cpp: 在函数
int main(int, char**):
test.cpp:29:错误:重载address_of(N*)的调用不明确
test.cpp:17: 注意:候选人是:void* address_of(T*, boost::enable_if<boost::is_polymorphic<T>, void>*)[with T = N]
test.cpp:20: 注意:void* address_of(T*, boost::disable_if<boost::is_polymorphic<T>, void>*)[with T = N]
在我看来,这里应该使用哪种重载似乎相当清楚。我的意思是我已经定义了一个替代方法,并且一次只能使用一个函数……我本以为 SFINAE 会处理使不必要的重载无效的问题。
我使用...(省略号)而不是disable_if 对其进行了修补,并且需要一个虚拟的第二个参数......但我仍然对编译器为什么会阻塞这个问题感兴趣。
【问题讨论】: