variadic模板和功能覆盖



我想使用variadic模板来进行此类呼叫:

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

这很模棱两可,因为

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);
 }

最新更新