【发布时间】:2021-04-04 17:20:45
【问题描述】:
我正在尝试使用 std::variant 实现静态多态。我想使用 VARIANT_METHOD 或 VARIANT_METHOD_CONST 声明方法,这些方法应采用返回类型、方法名称、参数和限定符。
#include <variant>
#define VARIANT_METHOD(retType, name, ...) \
template <typename... Args> retType name (Args&&... args) __VA_ARGS__ { \
return std::visit([...args = std::forward<Args>(args)] <typename T>(T& self) -> retType { \
return self.name(args...); \
}, static_cast<variant&>(*this)); \
}
#define VARIANT_METHOD_CONST(retType, name, ...) template <typename... Args> \
retType name (Args&&... args) __VA_ARGS__ { \
return std::visit([...args = std::forward<Args>(args)]<typename T>(const T& self) -> retType { \
return self.name(args...); \
}, static_cast<const variant&>(*this)); \
}
#define VARIANT_FIELD(name) \
decltype(auto) name() noexcept { \
return std::visit([](auto& self) -> decltype(auto) { \
return self.name; \
}, static_cast<variant&>(*this)); \
} \
decltype(auto) name() const noexcept { \
return std::visit([](const auto& self) -> decltype(auto) { \
return self.name; \
}, static_cast<const variant&>(*this)); \
}
struct A {
int field;
int field2;
int func(int a) const noexcept {
return a + field;
}
int func(int a, int b) const noexcept {
return a * a;
}
};
struct B {
int field2;
int func(int a) const noexcept {
return a * a;
}
int func(int a, int b) const noexcept {
return a * a;
}
};
struct C : protected std::variant<A, B> {
using variant::variant;
VARIANT_FIELD(field2);
VARIANT_METHOD_CONST(int, func, const noexcept); // (1)
};
int main() {
std::vector<C> vec;
vec.emplace_back(A{.field = 0, .field2 = 1});
vec.emplace_back(B{.field2 = 3});
for (auto& c : vec) {
c.func(10);
}
}
我不能声明两个具有相同名称但具有不同参数的方法。我想写这样的东西:
VARIANT_METHOD_CONST(int, func, (int a), const noexcept);
VARIANT_METHOD_CONST(int, func, (int a, int b), const noexcept);
【问题讨论】:
-
你可以先解释你正在尝试做什么以及你遇到了什么错误。
-
嗯...对不起?
-
不,我的意思是您可以从编辑问题开始,描述您想要实现的目标以及遇到的错误。
-
I want to write something like this:好的,结果应该是什么? -
我的意思是字面意思,它应该在文本上产生什么结果?所以就写
int func(int) {} int func(int, int){}?: protected std::variant是否允许从任何std::类继承?为什么不直接使用合成?为什么是所有的宏?
标签: c++ variant static-polymorphism