Как вызвать функцию шаблона с переменным параметром шаблона?

#c #c 11 #templates #c 14 #variadic-templates

#c #c 11 #шаблоны #c 14 #variadic-шаблоны

Вопрос:

Ниже приведена моя простая функция шаблона с переменным параметром. Этот шаблон принимает std::tuple в качестве одного из своих входных параметров. Но он отказывается компилироваться с ошибкой «ошибка вычитания / замены аргумента шаблона».

Кто-нибудь, пожалуйста, может указать мне на ошибку, которую я допускаю?

 #include <tuple>

using namespace std;

template<typename... TT, typename ReturnType>
ReturnTypeamp; getValue(int ind, std::tuple<TT...>amp; t, ReturnTypeamp; val) {                                                                                                                                                                                                                                                                                                                        
    return val;                                                                                                                                                                                                                                                                                                                                                                               
}

int main() {                                                                                                                                                                                                                                                                                                                                                                                  
    std::string str("Hello"), result;                                                                                                                                                                                                                                                                                                                                                         
    std::tuple<std::string> t = std::make_tuple(str);                                                                                                                                                                                                                                                                                                                                         

    getValue<std::tuple<std::string>, std::string>(0, t, result);                                                                                                                                                                                                                                                                                                                             
    return 0;                                                                                                                                                                                                                                                                                                                                                                                 
}
  

Ниже приведен результат компиляции.

 g   -c tuple.cc -std=c  1z; g   -o tuple tuple.o
tuple.cc: In function ‘int main()’:
tuple.cc:15:64: error: no matching function for call to ‘getValue(int, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >amp;, std::__cxx11::stringamp;)’
     getValue<std::tuple<std::string>, std::string>(0, t, result);
                                                                ^
tuple.cc:7:13: note: candidate: template<class ... TT, class ReturnType> ReturnTypeamp; getValue(int, std::tuple<_Elements ...>amp;, ReturnTypeamp;)
 ReturnTypeamp; getValue(int ind, std::tuple<TT...>amp; t, ReturnTypeamp; val) {
             ^
tuple.cc:7:13: note:   template argument deduction/substitution failed:
tuple.cc:15:64: note:   mismatched types ‘std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >’ and ‘std::__cxx11::basic_string<char>’
     getValue<std::tuple<std::string>, std::string>(0, t, result);
                                                                ^

  

Спасибо.

Ответ №1:

 getValue(0, t, result);   
  

это приведет к компиляции. ...TT это не кортеж, это std::string .

Вы пытались вызвать его с помощью ...TT being std::tuple<std::string>, std::string, ... , что, конечно, не соответствует std::string .

Комментарии:

1. В кортеже было еще несколько элементов, которые я удалил при отладке ошибки. Итак, я всегда должен вызывать функцию без шаблона без параметров шаблона, если один из параметров является tuple?

2. @unsat нет, это не правило. Но пусть он выводит, если может. И это часто может.

3. Последний последующий вопрос 🙂 Как будет выглядеть явно параметризованный вызов функции шаблона?

4. @UnSat Это невозможно; у вас есть параметры шаблона, следующие за пакетом.

5. Это интересно для меня. Это тот случай, когда вывод типа параметра шаблона работает, а замена типа параметра — нет.