[英]Should I use Boost Variant for class with different type parameters
我是C ++的新手,我不确定模拟类来表示列表的最佳方法; 其中一个列是一个带有名称(字符串)的STL向量的包装器,并且应该是Column<int>
, Column<float>
或Column<std::string>
。
目前我已将其硬编码为Column<int>
但需要支持Column<float>
或Column<std::string>
。
我应该沿着提升变体路线(又名标记联盟)走下去吗?
boost::variant<Column<int>*, Column<float>*, Column<std::string>*>
不确定是否有更好的解决方案,因为它只是不同的类型参数。
我要感谢C ++众神分享他们的智慧。
template <typename T>
class Column
{
public:
Column(std::string& name, std::vector<T>& vec) : name(name), vec(vec) {}
T& at(const size_t i) { return vec[i]; }
private:
std::string name;
std::vector<T> vec;
};
class Table
{
public:
Table(std::string& name) : name{name} {}
void addColumn(Column<int>* vec)
{
columns.push_back(vec);
}
Column<int>*& getColumn(const size_t i)
{
return columns[i];
}
private:
std::string name;
std::vector<Column<int>*> columns;
};
是的,使用Boost.Variant是合理的。 但是,您根本不需要使用指针; 代替:
boost::variant<Column<int>, Column<float>, Column<std::string>>
如果变体适合您的用例: 确定 ! 模板实例只是类型。
您可以将设计切换为更类似的设计
Column<boost::variant<int, float, std::string>>
相反,虽然
您可以从类型列表生成变体:
column_variant<int, float, std::string>
在c ++ 11中,这是微不足道的:
template <typename... Ts> using make_column_variant = typename boost::make_variant_over<boost::mpl::vector<Column<Ts>...>>::type;
这是一个c ++ 03版本:
#include <boost/variant.hpp> #include <boost/mpl/vector.hpp> #include <iostream> template <typename T> struct Column { T v; Column(T const& v) : v(v) {} friend std::ostream& operator<<(std::ostream& os, Column<T> const& cv) { return os << cv.v; } }; /* c++03 helper */ namespace mpl = boost::mpl; template <typename Seq> struct make_column_variant { typedef typename mpl::transform< Seq, Column<mpl::_1>, mpl::back_inserter<mpl::vector<> > >::type columns; typedef typename boost::make_variant_over<columns>::type type; }; int main() { make_column_variant<mpl::vector<int, float, std::string> >::type v(std::string("hello world")); std::cout << v; }
在C ++ 11中,这可以大大缩短
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.