Использование std :: function с шаблонами - PullRequest
0 голосов
/ 26 сентября 2018

Так что в его самой дистиллированной форме у меня происходит что-то подобное,

template <class T>
bool f(const T &a, const T &b, std::function<bool(const T&, const T&)> func)
{
    return func(a,b);
}

template <class T>
bool g(const T &a, const T &b)
{
    return true;
}  

Но любая попытка вызвать f(), с чем-либо, f('a', 'b', g), f(1, 2, g), всегда приводит к "нет соответствующей функции для вызова 'f' ", независимо от того, передаю ли я переменные в виде константных ссылок или просто в виде простых значений или чего-то ещеЯ предполагаю, что это не в состоянии вывести некоторый шаблон, но я понятия не имею, где или почему.

Признаюсь, я очень слабо разбираюсь в том, как вообще использовать функциональные объекты, возможно ли сделать что-то подобное?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Параметр func объявлен как std::function, и вы пытаетесь передать указатель на функцию, которая требует неявного преобразования. Вывод аргумента шаблона не учитывает неявное преобразование, а затем происходит сбой вывода.

Вывод типа не учитывает неявное преобразование (кроме корректировок типа, перечисленных выше): это работа для перегрузкиразрешение, которое произойдет позже.

Вы можете явно создать std::function,

f('a', 'b', static_cast<std::function<bool(const char&, const char&)>>(g<char>));

Или указать аргумент шаблона явно (для выведения аргумента шаблона и выполнения неявного преобразования, принимаяэффект позже),

f<char>('a', 'b', g<char>);    

Или просто не используйте std::function.

template <class T, class F>
bool f(const T &a, const T &b, F func)
{
    return func(a,b);
}

f('a', 'b', g<char>);
0 голосов
/ 26 сентября 2018

Я немного исправил это для вас и добавил несколько примеров.Это должно помочь вам понять, как использовать простую функцию std ::.

#include <iostream>
#include <string>
#include <functional>

template <class T>
bool f(const T &a, const T &b, std::function<bool(const T&, const T&)> func)
{
    return func(a,b);
}

template <class T>
bool g(const T &a, const T &b)
{
    return a==b; // a simple comparator
}  

int main()
{
   int a = 1;
   int b = 1;

   // instantiate f and g as integer type functions
   if( f<int>(a,b,g<int>) == true) 
      std::cout << "true" << std::endl;
   else
      std::cout << "false" << std::endl;

   std::string c="dead";
   std::string d="beef";
   // and now as strings
   if( f<std::string>(c,d,g<std::string>) == true) 
      std::cout << "true" << std::endl;
   else
      std::cout << "false" << std::endl;
   return 0;
}
...