模板类作为Stl容器参数

问题描述 投票:2回答:1

我想使用任何STL容器,例如具有自己模板类型的std::vector,例如OptionParams

如果我使用空的main函数编译代码-一切正常,但是如果我想在容器中打印模板类的任何字段,则会出错。我不确定,这可能在Stl容器模板类中使用。

#include <vector>
#include <map>
#include <string>
#include <iostream>

template <typename T>
struct OptionParams {
    OptionParams(int level, int name, bool is_flag, T value) : level_(level), 
            name_(name), is_flag_(is_flag), value_(value) {}
    int level_;
    int name_;
    bool is_flag_;
    T value_;
};

template <typename T>
std::vector<OptionParams<T>> Options = {
    {OptionParams<int>(1, 2, 0, 3)},
    {OptionParams<std::string>(1, 2, 1, "hello")}
};

int main() {
    std::cout << Options<int>[0].level_ << std::endl;
}
map2.cpp: In instantiation of ‘std::vector<OptionParams<int>, std::allocator<OptionParams<int> > > Options<int>’:
map2.cpp:23:16:   required from here
map2.cpp:17:30: error: could not convert ‘{{OptionParams<int>(1, 2, 0, 3)}, {OptionParams<std::__cxx11::basic_string<char> >(1, 2, 1, std::__cxx11::basic_string<char>(((const char*)"hello"), std::allocator<char>()))}}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<OptionParams<int>, std::allocator<OptionParams<int> > >’
 std::vector<OptionParams<T>> Options = {
                              ^~~~~~~
c++ templates stl
1个回答
4
投票

Options是一个变量模板,您可以使用单个参数T实例化以获得变量。当使用Options<int>中的main进行操作时,您将得到一个std::vector<OptionParams<int>>,它可以only存储OptionParams<int>,但不能存储OptionParams<std::string>。由于不同的OptionParam<T>之间无法进行转换,因此会出现错误。

如果要在std::vector中存储异构对象,则需要某种类型的擦除。例如,使OptionParams<T>的所有专业化都从一个公共基类继承,并将std::unique_ptr存储到该基类。

© www.soinside.com 2019 - 2024. All rights reserved.