可变参数模板和函数覆盖

时间:2017-11-21 23:52:36

标签: c++ c++11 recursion variadic-templates function-overriding

我想使用可变参数模板来进行此类调用:

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

1 个答案:

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