当前位置: 首页 > 知识库问答 >
问题:

使用SFINAE根据函数是否存在特定重载来选择函数[duplicate]

和光启
2023-03-14

我一直在尝试根据重载运算符是否为

例子:

template <typename T, typename std::enable_if</* ? */, int>::type = 0>
std::string stringify(const T& t)
{
    std::stringstream ss;
    ss << t;
    return ss.str();
}

template <typename T, typename std::enable_if</* ? */, int>::type = 0>
std::string stringify(const T& t)
{
    return "No overload of operator<<";
}

struct Foo { };

int main()
{
    std::cout << stringify(11) << std::endl;
    std::cout << stringify(Foo{}) << std::endl;
}

这可能吗?如果是这样,你将如何解决这个问题?


共有1个答案

齐望
2023-03-14

无需启用。\u如果运算符

namespace detail
{
    template<typename T>
    auto stringify(std::stringstream& ss, T const& t, bool)
        -> decltype(ss << t, void(), std::string{})
    {
        ss << t;
        return ss.str();
    }

    template<typename T>
    auto stringify(std::stringstream&, T const&, int)
        -> std::string
    {
        return "No overload of operator<<";
    }
}

template <typename T>
std::string stringify(const T& t)
{
    std::stringstream ss;
    return detail::stringify(ss, t, true);
}

现场演示

stringify函数模板只是委托给一个::stringify函数模板。然后,如果表达式ss,则选择第一个

此表达式decltype(ss

第一个,ss

中间的子表达式val()除了确保未选择某些用户定义的运算符之外,不做任何其他操作(因为您不能使用val参数类型重载运算符)。

第三个,也是最右边的子表达式,std::string{}是用来确定stringify函数的返回类型::。

 类似资料:
  • 基本上,我想写这样的代码: 这是不可能的,因为没有重载 因此,我目前正在使用,但它并不完美。 有没有一种方法可以不重新声明函数就知道函数是否存在? 基本上,我想做一些类似的事情 和主要的:

  • 我一直试图理解C++选择模板的方式。即,考虑以下代码示例: 前两个函数(test1)工作正常(为什么?): 一个常见的错误是声明两个仅在默认模板参数上不同的函数模板。这是非法的,因为默认模板参数不是函数模板签名的一部分,并且用相同的签名声明两个不同的函数模板是非法的。 所以看起来是这样的。但是,我看不出与前两个函数有太大的不同,前两个函数也有默认的模板参数。因此,我们对默认值(test1-work

  • 例如,重载这两个: 因此,当被调用时,编译器将在每个调用中匹配正确的函数: 相关问题:概念会取代sfinae吗?

  • 是否有一种方法可以更改“starts_with”命令来选择所有以大写字母和句号开头的列?我尝试使用诸如“[A-Z]”之类的修改。都没有成功。 提前致谢

  • 条款24: 在函数重载和设定参数缺省值间慎重选择 会对函数重载和设定参数缺省值产生混淆的原因在于,它们都允许一个函数以多种方式被调用: void f(); // f被重载 void f(int x); f(); // 调用f() f(10); // 调用f(int) void g(int x = 0); // g 有一个 // 缺省参数值 g(); // 调用g(0) g(10); // 调

  • 我有一个Redux操作,它本身分派了另外两个操作。每个操作都是从导入的函数中检索的。一个来自本地模块,另一个来自外部库。 在我的测试中,我使用一个 沙箱来存根函数,但只有两个测试通过。我期待所有3个都通过。 最后一个预期失败,错误为: TypeError:[Function:functionB]不是间谍或对间谍的调用! 当我将功能输出到控制台时,我得到了这个,这似乎与Babel导入导出导出的方式有