LINUX.ORG.RU

Function template with a template argument.

 ,


0

2

Что ему не нравиться?

#include <iostream>
#include <functional>

using namespace std;

template <template <class> class F, typename D>
void f1(const F <D> &f, const D &d)
{
  f(d);
}

template <typename D>
void a(const D &d)
{
  cout << d << endl;
}

int main()
{
  f1(a, 23);
}
main.cpp: In function ‘int main()’:
main.cpp:21:11: error: no matching function for call to ‘f1(<unresolved overloaded function type>, int)’
main.cpp:21:11: note: candidate is:
main.cpp:8:6: note: template<template<class> class F, class D> void f1(const F<D>&, const D&)

спасибо.

★★★★

Последнее исправление: nanoolinux (всего исправлений: 1)

Проще тут было бы в функтор сделать, то есть, шаблонный класс с оператором(). Указатель на шаблонную или перегруженную функцию уродливо брать.

ratatosk
()

И да, в качастве шаблонного шаблонного параметра компилятор хочет имя class template, а не function template, так что функцию тут, мне кажется, не пропихнуть.

ratatosk
()
#include <iostream>
#include <functional>
 
using namespace std;
 
template <template <class> class F, typename D>
void f1(const D &d)
{
  F<D>()(d);
}
 
template <typename D>
struct A 
{
	void operator()(const D &d) const
	{		
  		cout << d << endl;
	}
};
 
int main()
{
  f1<A>(23);
}
ratatosk
()

Насколько я понял, он не знает какой тип у a ты имеешь в виду.

KblCb ★★★★★
()
#include <iostream>
#include <functional>

using namespace std;

//template <template <class> class F, typename D>
//void f1(const F <D> &f, const D &d)
template <typename F, typename D>
void f1(const F &f, const D &d)
{
  f(d);
}

template <typename D>
void a(const D &d)
{
  cout << d << endl;
}

int main()
{
	f1(a<int>, 23);
}

Во первых, у Вас там описано что оно получает класс, а Вы суете ему ф-ю. Во вторых и главных - вывод аргументов шаблона без инстацирования ЕМНИП не работает. Т.е. самодостаточного объекта «a» не существует, и использовать его в качесте аргумента функции нельзя. В качестве аргумента шаблона - можно, в т.ч. можно передавать адрес функции в качестве аргумента шаблона.

AIv ★★★★★
()
Ответ на: комментарий от AIv
#include <iostream>
#include <functional>

using namespace std;

//template <template <class> class F, typename D>
//void f1(const F <D> &f, const D &d)
//template <typename F, typename D>
//void f1(const F &f, const D &d)
template <typename D, void (*f)(const D&)>
void f1(const D &d)
{
  f(d);
}

template <typename D>
void a(const D &d)
{
  cout << d << endl;
}

int main()
{
	f1<int, a>(23);
}

А вот что бы тип D выводился при этом автоматически... это проще через функтор, как ratatosk предложил.

AIv ★★★★★
()

AIv все точно расписал, а так как вы хотели, так кажется нельзя вообще, хотя могу ошибаться, хотелось бы услышать опровержение.

Boy_from_Jungle ★★★★
()
#include <iostream>
#include <functional>

using namespace std;

template <typename D >
void f1(void (*f)(const D &), const D &d)
{
  f(d);
}

template <typename D>
void a(const D &d)
{
  cout << d << endl;
}

int main()
{
  f1(&a, 23);
}
anonymous
()
Ответ на: комментарий от Kuzy

Не знал, что этот тег для форта. Прошу прощения.

nanoolinux ★★★★
() автор топика
Ответ на: комментарий от ratatosk

Вот блин. Я предполагал, что в этом причина, но не был уверен до конца.

Короче, наиболее простой вариант тогда что-то вроде

template <typename F, typename D>
void f1(const F &f, const D &d)
{
  f(d);
}

int main()
{
  f1([] (int i) {cout << i << endl;}, 23);
}

nanoolinux ★★★★
() автор топика
Ответ на: комментарий от nanoolinux

Короче, наиболее простой вариант тогда что-то вроде

template<class F, class... Args,
    class = typename std::enable_if<!std::is_member_function_pointer<F>::value>::type,
    class = typename std::enable_if<!std::is_member_object_pointer<F>::value>::type>
auto func(F&& f, Args&&... args) -> decltype(f(std::forward<Args>(args)...))
{
    return f(std::forward<Args>(args)...);
}
Boy_from_Jungle ★★★★
()
Ответ на: комментарий от anonymous

Круто. Я почему-то был уверен, что от шаблонной или перегруженной функции адрес можно взять только с явным приведением, видимо после неудачных попыток скормить такой адрес в качестве параметра, который используется для вывода шаблонного типа, как компаратор в алгоритмы.

ratatosk
()
Ответ на: комментарий от anonymous

И даже без амперсенда работает, спасибо.

AIv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.