繁体   English   中英

我应该在具有不同类型参数的类中使用Boost Variant

[英]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>>

如果变体适合您的用例: 确定 模板实例只是类型。

  1. 您可以将设计切换为更类似的设计

     Column<boost::variant<int, float, std::string>> 

    相反,虽然

  2. 您可以从类型列表生成变体:

     column_variant<int, float, std::string> 

    在c ++ 11中,这是微不足道的:

    住在Coliru

     template <typename... Ts> using make_column_variant = typename boost::make_variant_over<boost::mpl::vector<Column<Ts>...>>::type; 

    这是一个c ++ 03版本:

    住在Coliru

     #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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM