c++ - 没有enable_if 的表达式SFINAE?

标签 c++ templates sfinae

我写了一个程序如下

#include <iostream>
#include <vector>
#include <string>

using namespace std;

template <typename T>
auto serialize(const T& t) -> decltype(to_string(t))
{
    return to_string(t);
}

template <typename T>
auto serialize(const T& t) -> string
{
    return "<object>";
}


int main()
{
    cout<<serialize(4)<<endl;
    cout<<serialize(vector<int>())<<endl;
    return 0;
}

to_string支持程序类型时,我希望使用第一个模板。但如果 to_string 不支持该类型,那么我希望使用第二个模板。

我希望看到以下结果

4
<object>

但是当我编译程序时,出现以下错误

main.cpp: In function ‘int main()’:
main.cpp:22:19: error: call of overloaded ‘serialize(int)’ is ambiguous
  cout<<serialize(4)<<endl;
                   ^
compilation terminated due to -Wfatal-errors.

我实际上不能责怪编译器。如何在不使用 enable_ifenable_if_t 的情况下消除这种歧义。通过 SFINAE 和表达式使程序保持简单。事实上,decltype(to_string(t)) 已经很清楚了。但是,类型没有 nototherwise 运算符。

最佳答案

您可以使用额外的参数来优先考虑重载:

template <std::size_t N> struct OverloadPriority : OverloadPriority<N -1> {};
template <> struct OverloadPriority<0> {};

template <typename T>
auto serialize_impl(const T& t, OverloadPriority<1>) -> decltype(to_string(t))
{
    return to_string(t);
}

template <typename T>
auto serialize_impl(const T& t, OverloadPriority<0>) -> std::string
{
    return "<object>";
}

template <typename T>
decltype(auto) serialize(const T& t)
{
    return serialize_impl(t, OverloadPriority<1>{});
}

Demo

关于c++ - 没有enable_if 的表达式SFINAE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52427923/

相关文章:

c++ - 定义中的模板函数

c++ - 为多个类或函数声明一次模板<typename T>

c++ - 线性重载: why clang fails where gcc compiles?

c++ - decltype(auto) 在某些情况下与 SFINAE 一起使用?

c++ - 如何在 pre-C++11、C++11、14 和 17 中简化复杂的 SFINAE 语法?

c++ - QMap 通过指针或值插入 QVector<QString>?

c++ - 通过指针访问三维数组

c++ - 如何使用模板而不是宏来创建具有动态数量函数的类

c++ - 如何通过 C++ 找出当前用户属于哪个组?

c++ - QThread 来回传递数据