У меня есть сторонние библиотеки, которая реализует перегруженные функции с однородными входными параметрами, как:Преобразования вектора или массива в список аргументов в C++
int foo(int a);
int foo(int a, int b);
int foo(int a, int b, int c);
...
Теперь я хотел бы написать оболочку, которая будет принять параметры, упакованные в вектор (или, альтернативно, массив):
int foo_wrapper(vector<int>& foo_args);
Как это сделать?
Я посмотрел на this answer on converting vector to tuple за подсказку, но он дает мне ошибку:
$ g++ -std=c++14 -o test.a test.cpp
test.cpp: In function 'int main(int, char**)':
test.cpp:23:20: error: no matching function for call to 'vectorToTuple(std::vector<int>&)'
vectorToTuple(v);
^
test.cpp:16:6: note: candidate: template<long unsigned int N, class T> auto vectorToTuple(const std::vector<T>&)
auto vectorToTuple(const std::vector<T>& v) {
^~~~~~~~~~~~~
test.cpp:16:6: note: template argument deduction/substitution failed:
test.cpp:23:20: note: couldn't deduce template parameter 'N'
vectorToTuple(v);
^
с test.cpp
быть
#include <iostream>
#include <vector>
#include <tuple>
#include <utility>
int foo(int a) {return a;};
int foo(int a, int b) {return a+b;};
int foo(int a, int b, int c) {return a+b+c;};
template <typename T, std::size_t... Indices>
auto vectorToTupleHelper(const std::vector<T>& v, std::index_sequence<Indices...>) {
return std::make_tuple(v[Indices]...);
}
template <std::size_t N, typename T>
auto vectorToTuple(const std::vector<T>& v) {
//assert(v.size() >= N);
return vectorToTupleHelper(v, std::make_index_sequence<N>());
}
int main(int argc, char** argv) {
std::vector<int> v={1,2};
vectorToTuple(v);
}
Чтобы устранить эту ошибку, ответ очевиден, поставьте 'N':' vectorToTuple <2> (v); 'не знаю, действительно ли это решает вашу проблему, где вы вызываете' foo'? – imreal
вы не можете с 'std :: vector <>'; разрешение перегрузки выполняется во время компиляции, но размер 'vector <>' известен только во время выполнения. –