如何重载参数可以是任何类型向量的模板函数
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
我有一个 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