代码之家  ›  专栏  ›  技术社区  ›  Kirill Korolev

可变模板和函数覆盖

  •  -1
  • Kirill Korolev  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  2
  •   max66    7 年前

    这是不明确的,因为

    template <typename __First>
    

    只要求一个模板类型参数,并

    template <typename __First, typename... __Args>
    

    询问一个或多个模板类型参数。

    两个或多个参数(第二个参数是choose)都很好,但是当只使用一个参数调用函数时?

    解决该问题的一种可能方法是在第二个版本中施加两个或多个参数。类似于

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