我想使用可变参数模板来进行此类调用:
make_set<int, double, int>("...");
基本上,只要至少有一个参数,就可以调用递归read_row()
函数。
以下是被覆盖的函数:
template <typename __First>
void read_row(Row r){}
template <typename __First, typename... __Args>
void read_row(Row r)
{
int index = r.size() - sizeof...(__Args);
auto value = r.getValue<__First>(index);
read_row<__Args...>(r);
}
template <typename... __Args>
void make_set(const char* fileName="")
{
Parser parser(fileName);
for(int i = 0; i < parser.rowCount(); ++i)
{
auto row = parser.getRow(i);
read_row<__Args...>(row);
}
}
但是编译器坚持认为递归调用是不明确的。
/Users/kirill/Desktop/TSP-EQ/TSP-EQ/tspeq/tspset/tspset.hpp:42:13: Call to 'read_row' is ambiguous
答案 0 :(得分:2)
这是不明确的,因为
template <typename __First>
询问一个模板类型参数和
template <typename __First, typename... __Args>
询问一个或多个模板类型参数。
一切顺利,有两个或更多参数(第二个是选择),但是当只用一个参数调用函数时?
解决问题的一种可能方法是在第二个版本中施加两个或更多参数。像
这样的东西template <typename F>
void read_row (Row r)
{
// auto value = r.getValue<F>(r.size()); ???
}
template <typename F, typename S, typename... As>
void read_row (Row r)
{
int index = r.size() - (1U + sizeof...(As));
auto value = r.getValue<F>(index);
read_row<S, As...>(r);
}