gpt4 book ai didi

c++ - 使用 SFINAE 检查类型的函数 std::to_string 是否存在

转载 作者:太空狗 更新时间:2023-10-29 20:19:47 26 4
gpt4 key购买 nike

我想创建一个专门用于可能应用了 std::to_string 的类型的函数模板,另一个用于我定义了 mylib::to_string< 的类,并让任何它可能不会落入其他实现或特化的类型。

例子:

// I only want this to be found if std::to_string exists for ItemType
template<typename ItemType>
void func(ItemType &i)
{
std::cout << std::to_string(i);
}

// I only want this to be found if mylib::to_string exists for ItemType
template<typename ItemType>
void func(ItemType &i)
{
std::cout << mylib::to_string(i);
}

// And finally, I'd like to be able to fall through to anything that has a << defined for streams
template<>
void func<MyClass>(MyClass &i)
{
std::cout << MySpecialConverterFunc(i);
}

我总是对 std::enable_if 语法有疑问。您将如何将其添加到第一个模板?

最佳答案

对于 SFINAE,您不需要专门化,而是重载。无论如何,这比处理特化更明智(那些有怪癖)。 SFINAE 是一种指导重载解析的机制,而不是用于选择函数模板的显式特化。

至于检查本身,您真的不需要enable_if。只需一点表达 SFINAE 即可:

template<typename ItemType>
auto func(ItemType &i) -> decltype(std::to_string(i), void())
{
std::cout << std::to_string(i);
}

void func(MyClass &i)
{
std::cout << MySpecialConverterFunc(i);
}

在上面的代码中,decltype 应用于逗号表达式。左侧是 std::to_string(i),如果它的格式不正确,则整个表达式的格式不正确,我们会得到一个替换错误,使编译器丢弃它过载(“不是错误”部分)。如果格式正确,右侧是 void() 字面量,因此 decltype 按您的意愿解析为 void

当替换失败时,我们只剩下第二个重载,所以它被选中了。无论如何都会为这种情况选择它,因为如果签名相同,非模板重载在重载决议中总是受到青睐。但在其他情况下添加检查以更好地指导编译器本身并不是一个坏主意。

关于c++ - 使用 SFINAE 检查类型的函数 std::to_string 是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56353816/

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