提升变体对常用方法的简单调用
boost variant simple call to common methods
我有两个指针,只能设置其中一个,所以我正在考虑使用boost::variant,说:boost::variant<shared_ptr<Type1> shared_ptr<Type2>>
。类型 1 和类型 2 不同,但它们共享一些功能。例如,两者都有 IsUnique
方法。
如果我有检查初始化的代码:
ASSERT(type1 != nullptr || type2 != nullptr);
ASSERT(type1 == nullptr || type2 == nullptr);
ASSERT(type1 == nullptr || type1->IsUnique());
ASSERT(type2 == nullptr || type2->IsUnique());
我希望能够用尽可能接近的东西替换它:
ASSERT(variant != nullptr);
ASSERT(variant->IsUnique());
不过好像要定义访问者,切换类型。
我是否遗漏了什么,是否有模板或其他东西可以让我将某些东西应用于当前的任何类型?它可能是 c++14.
你也许可以直接说
boost::apply_visitor([](auto const& obj) { obj.some_operation(); }, v);
在 c++14 中,最近得到了提升。让我试试看...
是的,你可以:Live On Coliru
#include <boost/variant.hpp>
struct A { void some_operation() const {}; };
struct B { void some_operation() const {}; };
using Obj = boost::variant<A, B>;
int main() {
Obj v;
boost::apply_visitor([](auto const& obj) { obj.some_operation(); }, v);
}
我经常使用的一种模式是为访问者提供处理变体的重载:
struct IsNullThing {
bool operator()(Null) const { return true; }
template <typename T> bool operator()(T) const { return false; }
template <typename... Ts> bool operator()(boost::variant<Ts...> const& v) const {
return boost::apply_visitor(*this, v);
}
};
这样你可以做到:
IsNullThing isNullThing;
// and just call it
MyVariant v;
bool ok = isNullThing(v);
我有两个指针,只能设置其中一个,所以我正在考虑使用boost::variant,说:boost::variant<shared_ptr<Type1> shared_ptr<Type2>>
。类型 1 和类型 2 不同,但它们共享一些功能。例如,两者都有 IsUnique
方法。
如果我有检查初始化的代码:
ASSERT(type1 != nullptr || type2 != nullptr);
ASSERT(type1 == nullptr || type2 == nullptr);
ASSERT(type1 == nullptr || type1->IsUnique());
ASSERT(type2 == nullptr || type2->IsUnique());
我希望能够用尽可能接近的东西替换它:
ASSERT(variant != nullptr);
ASSERT(variant->IsUnique());
不过好像要定义访问者,切换类型。
我是否遗漏了什么,是否有模板或其他东西可以让我将某些东西应用于当前的任何类型?它可能是 c++14.
你也许可以直接说
boost::apply_visitor([](auto const& obj) { obj.some_operation(); }, v);
在 c++14 中,最近得到了提升。让我试试看...
是的,你可以:Live On Coliru
#include <boost/variant.hpp>
struct A { void some_operation() const {}; };
struct B { void some_operation() const {}; };
using Obj = boost::variant<A, B>;
int main() {
Obj v;
boost::apply_visitor([](auto const& obj) { obj.some_operation(); }, v);
}
我经常使用的一种模式是为访问者提供处理变体的重载:
struct IsNullThing {
bool operator()(Null) const { return true; }
template <typename T> bool operator()(T) const { return false; }
template <typename... Ts> bool operator()(boost::variant<Ts...> const& v) const {
return boost::apply_visitor(*this, v);
}
};
这样你可以做到:
IsNullThing isNullThing;
// and just call it
MyVariant v;
bool ok = isNullThing(v);