我目前正在尝试实现一个 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
?到目前为止,我发现没有办法检查某些东西是否不存在,只能反过来。我希望有人知道如何解决这个问题,并感谢您的时间。
最佳答案
您还可以将 static_assert
与自定义错误消息一起使用:
class Dummy
{
public:
std::string toString() const;
private:
Dummy() = default;
};
template <typename... Ts>
auto toString(Ts...)
{
static_assert(std::is_same<std::tuple<Ts...>, std::tuple<Dummy>>::value, "neither std::to_str nor member toString() exists");
return "";
}
live example
关于c++ - 当函数不存在时 SFINAE 回退,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46629659/