gpt4 book ai didi

c++ - 当函数不存在时 SFINAE 回退

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:58:02 25 4
gpt4 key购买 nike

我目前正在尝试实现一个 toString 函数,该函数调用 .toString()std::to_string() 取决于哪个可用于推导类型

到目前为止,我有这个工作片段:

#include <iostream>
#include <string>

template <class T>
auto toString(const T& obj)
-> decltype(obj.toString(), std::string())
{
return obj.toString();
}

template <class T>
auto toString(const T& obj)
-> decltype(std::to_string(obj), std::string())
{
return std::to_string(obj);
}

template <class T>
auto toString(const T& obj)
-> decltype(std::string(obj))
{
return std::string(obj);
}

class Foo{
public:
std::string toString() const {
return "Hello";
}
};

int main()
{
Foo bar;
std::cout << toString(bar);
std::cout << toString(5);
std::cout << toString("Hello const char*");
}

现在我想在上面的重载不可行时插入一个 static_assert,因为旧 GCC 版本的默认 GCC 错误消息不是很有用。

我如何检查 .toString()std::to_string() 是否都不能用于 T

到目前为止,我没有办法检查是否有东西存在,只有相反的方法。我希望有人知道如何解决这个问题,感谢您的宝贵时间。

最佳答案

你需要引入一个比你目前拥有的其他任何一个都更糟糕的过载,并将其删除。您无需检查这两个字符串函数是否都存在。

一种流行的方法是使用 C 风格的可变参数:

std::string toString(...) = delete;

关于c++ - 当函数不存在时 SFINAE 回退,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46629659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com