如何使用具有运行时类型的编译时接口?

我有一个函数,它接受 aT并在提供的对象上调用特定的函数。到目前为止,它是从编译时对象中使用的,所以一切都很好。最小的例子:

#include <iostream>

struct A {
   void fun() const { std::cout << "A" << std::endl; }
};

struct B {
   void fun() const { std::cout << "B" << std::endl; }
};

template<class T>
void use_function(const T& param) {
   param.fun();
}

int main() {
   use_function(A{}); // "A"
   use_function(B{}); // "B"
   return 0;
}

现在我试图将它use_function()与在运行时创建的对象一起使用并且很难。我不能使用std::variant或者std::any因为我需要为它们的访问函数提供类型作为模板参数 - 尽管它们的所有变体都满足函数接口。(失败的)变体方法的示例:

using var_type = std::variant<A, B>;

struct IdentityVisitor {
   template<class T>
   auto operator()(const T& alternative) const -> T {
      return alternative;
   }
};

int main() {
   var_type var = A{};

   // error C2338: visit() requires the result of all potential invocations to have the same type and value category (N4828 [variant.visit]/2).
   use_function(std::visit(IdentityVisitor{}, var));
   return 0;
}

什么可能的是直接调用用适当的类型像这样的功能:

if (rand() % 2 == 0)
   use_function(A{});
else
   use_function(B{});

只是将它存储在两者之间是我无法工作的。

我在技术层面上理解,但在想出一个优雅的解决方案时遇到了麻烦。有吗?我知道我甚至可以使用轻量级继承来重写对象 - 但我试图看看完全避免它是否可行,即使只是作为避免 OOP 以支持模板和概念的练习。我觉得变体应该可以解决这个问题,但显然不是。

回答

std::visit([](auto const& x) { use_function(x); }, var);


以上是如何使用具有运行时类型的编译时接口?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>