【发布时间】:2016-02-14 20:42:52
【问题描述】:
我正在尝试在 c++11 中使用 SFINAE 在具有相同签名但不同主体的两个函数之间进行选择,具体取决于在给定的 T 类型内是否应该有 typedef 的事实。例如,我有这两个结构,一个定义了 MyTypedef,一个什么都没有:
struct MyStruct1
{
typedef std::false_type MyTypedef;
...
}
struct MyStruct3
{
...
}
然后我有两个模板函数,它们应该将结构的类型作为 T 并根据 MyTypedef 的存在做不同的事情。特别是,如果定义了T::MyTypedef,我应该调用第一个函数,在所有其他情况下我应该调用第二个函数。我尝试过这样的事情:
template<typename T>
void myFunction()
{
...
}
template<typename T, typename std::enable_if<T::MyTypedef>::type* = nullptr>
typename myFunction()
{
...
}
但它不能编译,错误是 C2668 (MSVC) - 'function' : ambiguous call to overloaded function
【问题讨论】:
-
C++0x 不再存在,它是 C++11 的草稿名称
-
您还必须禁用第一个重载,当启用第二个时,反之亦然
-
我通过删除问题不需要的案例来简化示例代码。您能否解释一下如何禁用第一个重载并仅在定义 T::MyTypedef 时启用第二个?
-
另外,
typedef是一种糟糕的、老式的别名定义方式,如果可能的话,我建议您开始使用using。 -
@Stefano:如果您想在这样的重载集上使用 SFINAE,那么绝对不能出现模板参数可能导致两个重载都可见的情况。在您的情况下,您的第一次超载必须与您的 SFINAE 测试相反。我不知道如何进行这样的测试,否则我会发布答案。
标签: c++ templates c++11 sfinae