【发布时间】:2021-12-08 01:16:04
【问题描述】:
与How does std::visit work with std::variant?
的问题相关,但不是同一个问题为单个变体实现 std::visit 在概念上看起来像这样(在 C++ 伪代码中):
template<class F, class... Ts>
void visit(F&& f, variant<Ts...>&& var) {
using caller_type = void(*)(void*);
caller_type dispatch[] = {dispatch_visitor(f, (INDEX_SEQUENCE))...};
dispatch[var.index()](var);
};
基本上,我们设置了一个跳转表,为我们的访问者调用正确的调度程序。
对于多个变体,它似乎更复杂,因为对于这种方法,您需要计算所有变体备选方案的笛卡尔积,并且可能需要数千个函数的模板。这是它的完成方式还是标准库实现它的更好方式?
【问题讨论】:
-
是什么让您相信需要笛卡尔积?所需要做的就是一次发送一个变体。
-
@SamVarshavchik 如何在运算符
a, a和a, b之间解析?显然,您必须根据第二个变体的有效值选择其中一个 -
不,
std::visit不是这样工作的,有多种变体。 -
@samv 不,可以证明 std 访问需要笛卡尔积。我不确定你认为它有什么作用。
标签: c++ template-meta-programming