boost::variant 将 static_visitor 应用于某些类型
boost::variant apply static_visitor to certain types
我有以下变体:
typedef boost::variant<int, float, bool> TypeVariant;
我想创建一个访问者,将 int
或 float
类型转换为 bool
类型。
struct ConvertToBool : public boost::static_visitor<TypeVariant> {
TypeVariant operator()(int a) const {
return (bool)a;
}
TypeVariant operator()(float a) const {
return (bool)a;
}
};
然而,这是给我的错误信息:
'TypeVariant ConvertToBool::operator ()(float) const': cannot convert argument 1 from 'T' to 'float'
让访问者只申请某些类型的正确方法是什么?
只包含缺少的重载:
#include <boost/variant.hpp>
#include <iostream>
using TypeVariant = boost::variant<int, float, bool>;
struct ConvertToBool {
using result_type = TypeVariant;
TypeVariant operator()(TypeVariant const& v) const {
return boost::apply_visitor(*this, v);
}
TypeVariant operator()(int a) const { return a != 0; }
TypeVariant operator()(float a) const { return a != 0; }
TypeVariant operator()(bool a) const { return a; }
} static constexpr to_bool{};
int main() {
using V = TypeVariant;
for (V v : {V{}, {42}, {3.14f}, {true}}) {
std::cout << v << " -> " << std::boolalpha << to_bool(v) << "\n";
}
}
概括
在更一般的情况下,您可以提供一个包罗万象的模板重载:
template <typename T> TypeVariant operator()(T const& a) const {
return static_cast<bool>(a);
}
事实上,在你的小案例中,这就是你所需要的:
#include <boost/variant.hpp>
#include <iostream>
using TypeVariant = boost::variant<int, float, bool>;
struct ConvertToBool {
using result_type = TypeVariant;
TypeVariant operator()(TypeVariant const& v) const {
return boost::apply_visitor(*this, v);
}
template <typename T> TypeVariant operator()(T const& a) const {
return static_cast<bool>(a);
}
} static constexpr to_bool{};
int main() {
using V = TypeVariant;
for (V v : { V{}, { 42 }, { 3.14f }, { true } }) {
std::cout << v << " -> " << std::boolalpha << to_bool(v) << "\n";
}
}
仍然打印
0 -> false
42 -> true
3.14 -> true
true -> true
我有以下变体:
typedef boost::variant<int, float, bool> TypeVariant;
我想创建一个访问者,将 int
或 float
类型转换为 bool
类型。
struct ConvertToBool : public boost::static_visitor<TypeVariant> {
TypeVariant operator()(int a) const {
return (bool)a;
}
TypeVariant operator()(float a) const {
return (bool)a;
}
};
然而,这是给我的错误信息:
'TypeVariant ConvertToBool::operator ()(float) const': cannot convert argument 1 from 'T' to 'float'
让访问者只申请某些类型的正确方法是什么?
只包含缺少的重载:
#include <boost/variant.hpp>
#include <iostream>
using TypeVariant = boost::variant<int, float, bool>;
struct ConvertToBool {
using result_type = TypeVariant;
TypeVariant operator()(TypeVariant const& v) const {
return boost::apply_visitor(*this, v);
}
TypeVariant operator()(int a) const { return a != 0; }
TypeVariant operator()(float a) const { return a != 0; }
TypeVariant operator()(bool a) const { return a; }
} static constexpr to_bool{};
int main() {
using V = TypeVariant;
for (V v : {V{}, {42}, {3.14f}, {true}}) {
std::cout << v << " -> " << std::boolalpha << to_bool(v) << "\n";
}
}
概括
在更一般的情况下,您可以提供一个包罗万象的模板重载:
template <typename T> TypeVariant operator()(T const& a) const {
return static_cast<bool>(a);
}
事实上,在你的小案例中,这就是你所需要的:
#include <boost/variant.hpp>
#include <iostream>
using TypeVariant = boost::variant<int, float, bool>;
struct ConvertToBool {
using result_type = TypeVariant;
TypeVariant operator()(TypeVariant const& v) const {
return boost::apply_visitor(*this, v);
}
template <typename T> TypeVariant operator()(T const& a) const {
return static_cast<bool>(a);
}
} static constexpr to_bool{};
int main() {
using V = TypeVariant;
for (V v : { V{}, { 42 }, { 3.14f }, { true } }) {
std::cout << v << " -> " << std::boolalpha << to_bool(v) << "\n";
}
}
仍然打印
0 -> false
42 -> true
3.14 -> true
true -> true