#include <vector>
#include <functional>
template<class F>
class Foo
{
public:
template <class T>
void std_function(std::function<F(std::vector<T>)> functor)
{
/* something */
}
template <class T>
void func_ptr(F (*funtor)(std::vector<T>))
{
/* something else */
}
};
template<class T, class F>
F bar(std::vector<T>)
{
return F();
}
int main()
{
Foo<double> test;
std::function<double(std::vector<int>)> barz = bar<int, double>;
test.std_function(bar<int, double>); //error 1
test.std_function(barz); //OK 1
test.func_ptr(bar<int, double>); //OK 2
test.std_function(bar<int>); //error 2::1
test.func_ptr(bar<int>); //error 2::2
return 0;
}
Вопрос 1.Передача (частично) шаблонный шаблон функции, как станд :: функции (или указатель на функцию)
линия ошибка 1: Я пытаюсь передать явно инстанцированный шаблон функции (bar<int, double>
) как std::function
, но это не законно.
линия OK 1: Если я обернуть bar<int, double>
в std::function<double(std::vector<int>)>
и передать обернутый функтор, это законно в настоящее время.
линия OK 2: Если я прохожу через bar<int, double>
Foo::func_ptr
, который получает указатель на функцию в качестве аргумента вместо std::function
, он также законно.
Я хочу сделать линию error 1 legal. Как и в Линии OK 2, можно пройти bar<int, double>
без какой-либо обертки (в отличие от линии OK 1) и хранить ту же форму. Но тип параметра отличается. Я хочу передать как std::function
, а не указатель на функцию.
Вопрос 2.
Line Ошибка 2 :: 1 и 2 :: 2: То, что я пытаюсь достичь здесь есть, я хочу класс Foo
вывести тип возвращаемого bar
в качестве шаблона класса тип F
(для кода выше, F
is double
). Поэтому я могу просто пройти как bar<int>
, а не bar<int, double>
.
Но, похоже, у вас нет вычетов, потому что даже если я прохожу bar<int>
через Foo::func_ptr
, он по-прежнему вызывает ошибку. Как я могу заставить этот код работать как мое намерение?
Для пункта 2: [ничтожной counter_example (двойная (*) (std :: vector));] (http://coliru.stacked-crooked.com/a/eb9979b58f3f76e7) - Я могу преобразовать шаблон функции в указатель функции без передачи каких-либо аргументов шаблона. –
Yakk
@Yakk: Да, я этого не знал. Спасибо за обучение. Сообщение обновлено. – AndyG
Итак, использование указателя функции - лучший выбор в этом случае? – Gear