Наложение переменной шаблонной функции
У меня есть переменная функция, как:
void test(int){}
template<typename T,typename...Args>
void test(int& sum,T v,Args... args)
{
sum+=v;
test(sum,args...);
}
Я хочу, чтобы псевдоним это что-то вроде:
auto sum = test;//error : can not deduce auto from test
int main()
{
int res=0;
test(res,4,7);
std::cout<<res;
}
Я пытался с помощью std::bind
но он не работает с переменными функциями, потому что ему нужны заполнители...
Можно ли использовать псевдоним в качестве переменной функции?
3 ответа
В С ++1й:
#include <iostream>
void test(int){}
template<typename T,typename...Args>
void test(int& sum,T v,Args... args)
{
sum+=v;
test(sum,args...);
}
template<typename T,typename...Args>
decltype(test<T, Args...>)* sum = &(test<T, Args...>);
int main(void)
{
int res = 0;
sum<int, int>(res, 4, 7);
std::cout << res << std::endl;
}
В качестве альтернативы оберните его в другую переменную функцию и std::forward
аргументы:
template<typename T,typename...Args>
void other(int&sum, T v, Args&&... args)
{
test(sum, std::move(v), std::forward<Args>(args)...);
}
То, что вы пытаетесь, мало чем отличается от
void test(int)
{
}
void test(double, int)
{
}
auto a = test;
Компилятор не может определить, какую перегрузку вы хотите использовать.
Вы можете быть явно о которых test
Вы хотите назначить a
от:
auto a = (void(*)(int))test;
Если вы хотите добавить вариабельную версию шаблона в смесь, вы можете использовать:
template<typename T,typename...Args>
void test(int& sum,T v,Args... args)
{
sum+=v;
test(sum,args...);
}
auto a = test<int, int, int>;
Это не псевдоним.auto a = test
пытается объявить переменную a того же типа, что и test
и сделать их равными. Поскольку test - это не отдельная функция, а шаблон функции (и, кроме того, вы можете даже перегружать функции), компилятор не может решить, каким должен быть тип a.
Чтобы создать псевдоним шаблона или любого другого символа, вы можете использовать using
ключевое слово.
using a = test;
Изменить: извините, этот работает только для типов, а не функций.