gpt4 book ai didi

c++ - 仅当某个模板具有给定类的特化时如何 std::enable_if

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:13 26 4
gpt4 key购买 nike

我有以下模板:

namespace std {
template<typename Enum>
typename std::enable_if<std::is_enum<Enum>::value, std::ostream&>::type
operator<<(std::ostream& strm, Enum e)
{
return strm << helper_of<Enum>::to_string(e);
}
}

这有助于 google-test 在比较霍比特人时显示人类可读的诊断信息:

template <typename T> struct enumclass {}; // generic template

template <typename T>
using helper_of = typename enumclass<T>::helper; // more mnemonic

namespace MiddleEarth {
enum class Hobbit { Bilbo, Frodo, Sam };

struct HobbitHelper{
std::string to_string(Hobbit H);
Hobbit from_string(std::string const& s); // Hobbit-forming
};

template <> struct enumclass<Hobbit> {
using helper = HobbitHelper; // links Hobbit to its helper
}
}

enable_if有没有防止这个模板化的operator<<从应用于任何旧类(没有 enable_if 的天真版本对于已经具有流操作符的类是不明确的,例如 std::string )。

但是,如果有一个不特化 enumclass 的枚举,

enum class Wizard { Gandalf, Radagast, Saruman };
const Wizard g = Wizard::Gandalf, s = Wizard::Saruman;

然后下面的编译失败

EXPECT_EQ(g, s);

error: no type named 'helper' in 'aws::enumclass<Wizard>'因为编译器试图应用模板化的 operator<<向导。

是否可以构造一个 enable_if只有在有 enumclass<Enum> 的特化时才会应用此运算符<< ?然后 Google-test 会回退以显示 Wizard 的原始字节并进行编译。

如果做不到这一点,是否可以构造一个 enable_if哪个只允许特定命名空间中的类型(例如 MiddleEarth)?如果 Wizard 不在 MiddleEarth 命名空间中,这将解决问题。 MiddleEarth 中的所有枚举都应该具有 enumclass 的特化.

最佳答案

您可以将 helper_of 替换移动到模板规范本身:

template <typename Enum,
typename Helper = helper_of<Enum>>
std::ostream& operator<<(std::ostream& strm, Enum e)
{
return strm << Helper::to_string(e);
}

那样的话,如果 helper_of 替换失败(也就是说,enumclass 不是专门用于给定的 Enum),整个重载将由于 SFINAE 而不是硬编译错误而被抛出 - 因为现在我们处于替换本身的直接上下文中。

关于c++ - 仅当某个模板具有给定类的特化时如何 std::enable_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32053891/

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