如何重载参数可以是任何类型向量的模板函数

How to overload a template function where a parameter could be a vector of any kind

我有一个 class test,它有一个包含一堆字符串的向量。我希望能够 return 向量中的第一个值作为任何类型或任何类型的整个向量。 (所以我可以 return 第一个值作为 int 或整个数据向量作为 int 向量)

我现在有的东西不起作用,我正在寻求重载函数的帮助:


class test
{
public:
    std::string name;
    std::vector<std::string> data;


    test(const std::string& n) : name(n) {}
    

    void add_data(const std::string& s)
    {
        data.push_back(s);
    }
    
    // return first element of data
    template<typename T>
    T get()
    {
        return convert<T>(data[0]);  //converts data[0] to appropriate type
    }

    //return a vector of any type 
    template<typename T>
    std::vector<T> get<std::vector<T>>()
    {
        std::vector<T> ret_vector;
        for (std::string s : data)
        {
            ret_vector.push_back(convert<T>(s));
        }

        return ret_vector;
    }
};


int main(int argc, char* argv[])
{
    test a("first");
    test b("second");

    a.add_data("2");
    
    b.add_data("bob");
    b.add_data("john");

    a.get<std::string>(); 
    a.get<int>();
    b.get<std::vector<std::string>>();
}

我只是不确定如何正确重载第二个 get() 函数。我也认为我正在做我发现不允许的部分专业化。无论如何我能得到我想要的行为吗?现在我得到:

test.cpp:30:23: error: expected initializer before ‘<’ token
   30 |     std::vector<T> get<std::vector<T>>()
      |                       ^

非常感谢任何帮助。

我从相关的 post 中找到了一个解决方案,我以前找不到...

    template <typename T>
    T get()
    {
        return get_helper((T*)0); 
    }

    //return a single value
    template <typename T>
    T get_helper(T*)
    {
        return convert<T>(data[0]);
    }

    //return vector of values 
    template <typename T>
    std::vector<T> get_helper(std::vector<T> *)
    {
        std::vector<T> ret_vector;
        for (const std::string s : data)
            ret_vector.push_back(convert<T>(s));

        return ret_vector;
    }

相关post:ambiguous template overload for template parameter is a container