有人能告诉我为什么C++17的std::get<T>
是全局函数,而不是variant<...>
的成员函数吗?
有人能告诉我为什么C++17的std::get<T>
是全局函数,而不是variant<...>
的成员函数吗?
get<T>()
是一个成员函数模板,在依赖上下文中调用时需要使用 template
关键字。例如:template <typename Variant>
void f(Variant const& v) {
auto x0 = v.template get<T>(); // if it were a member
auto x1 = get<T>(v); // using a non-member function
}
using
声明或指令,get()
作为std::variant<...>
和get()
在命名空间std
中声明。因此,似乎没有充分的理由将其作为成员函数,因为全局函数更易于使用。get
的函数模板,才能正确解析 get<T>(v)
。不过,这仍然比每次都要写 template
要好。 - T.C.template <typename T> typename T::uncallable get();
;实际上参数数量并不重要...)。 - Dietmar Kühlemplace()
是成员函数呢?它似乎不需要template
关键字:https://en.cppreference.com/w/cpp/utility/variant/emplace - ShdNxget<T>(v)
需要明确指定T
,但v.emplace(a...)
则推导出所有的模板参数。因此,在这里问题并不存在。 - Dietmar Kühlemplace
的T
,否则它不知道要尝试从给定的参数构造什么。请参阅我早期链接到cppreference.com的示例。 - ShdNxstd::variant::emplace
也需要一个显式的模板参数。当v
的类型是一个模板参数时,在上下文中你需要写成v.template emplace<T>(a...)
。这意味着std::variant
的设计者们假设emplace
通常用于具有非依赖名称的对象。 - Dietmar Kühl