【发布时间】:2016-07-13 07:09:58
【问题描述】:
假设我写了:
template <typename T, typename = std::enable_if_t<std::is_integral<T>::value>>
void foo() { std::cout << "T is integral." << std::endl; }
template <typename T>
void foo() { std::cout << "Any T." << std::endl; }
int main() { foo<short>(); }
当我编译这个时,我得到一个关于调用歧义的错误(如果我用float 替换short 则没有错误)。我应该如何修复此代码,以便获得整数类型的较高版本和较低版本?
如果您的建议适用于除通用版本之外的多个专用版本的foo(),则可获得奖励积分。
【问题讨论】:
-
std::enable_if_t是 c++14 顺便说一句。 -
当你被正确的问题解决方案淹没时,这一定是个好日子 :-)
-
@RichardHodges:凭借经验,您设法增加了提出广受欢迎的问题的机会。不幸的是,通常是没有经验的人更需要这个。唉。
-
我没有时间为这个想法写一个完整的答案,但是到目前为止,一个与所有答案不同的想法是使用元编程库,如 boost::mpl 或 loki 和构建一个编译时关联容器,将类型特征与仿函数相关联,并在编译时使用该数据结构查找正确的函数。您可以轻松地将其扩展为适用于大量可能的特征组合,它使特征和功能之间的关联变得清晰。
标签: c++ c++11 c++14 sfinae enable-if