【问题标题】:Why is std::get<T> for `variant` a global function?为什么 `variant` 的 std::get<T> 是一个全局函数?
【发布时间】:2017-02-05 20:49:41
【问题描述】:

谁能告诉我为什么 C++17 的 std::get&lt;T&gt; 是全局函数而不是 variant&lt;...&gt; 的成员函数?

【问题讨论】:

  • 我会问一个补充问题:为什么它应该是一个成员函数?
  • Same as for tuple 当然。语法变得太丑了。
  • @PeteBecker:可发现性、直觉、与其他容器的一致性。

标签: c++ templates variadic-templates c++17


【解决方案1】:

如果get&lt;T&gt;() 是成员函数模板,则在依赖上下文中调用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 中找到 std::variant&lt;...&gt;get()。因此,似乎没有充分的理由将其设为成员函数,因为全局函数更易于使用。

【讨论】:

  • 好吧,您需要一个名为get 的函数模板,以便正确解析get&lt;T&gt;(v)。尽管如此,总比每次都写template要好。
  • @T.C.:好点 - 使用模板参数,它不是通过 ADL 直接找到的。这可能会主张在全局范围内声明一个不可调用的函数模板(例如,template &lt;typename T&gt; typename T::uncallable get();;参数的数量并不重要......)。
  • 那为什么emplace() 是会员呢?这似乎不需要template 关键字:en.cppreference.com/w/cpp/utility/variant/emplace
  • @ShdNx:问题在于使用显式指定的模板参数解析成员函数模板:虽然get&lt;T&gt;(v) 固有地要求指定T,但v.emplace(a...) 推导出其所有模板参数。因此,那里不存在问题。
  • @DietmarKühl:实际上,您需要为emplace 显式指定T,否则它不知道从给定的参数中尝试构造什么。有关示例,请参见我之前指向 cppreference.com 的链接。
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 2018-07-26
  • 2020-07-28
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多