Как избежать явного приведения с временными объектами std :: bind ()?

Тип возвращаемого значения std :: bind (намеренно) не указан. это хранимый в std :: function.

Приведенный ниже пример программы показывает, как я должен явным образом привести временный объект, возвращенный std :: bind (), к std :: function для вызова fn1 ().

Если бы возвращаемый тип std :: bind был понятен, я мог бы перегрузить конструктор Callback & больше не нужно явно приводить временные объекты std :: bind.

Есть ли способ избежать явного приведения?

// g++ -std=c++11 test.cxx
#include <functional>

using std::placeholders::_1;

class A
{
public:
void funcA (int x) { }
};

class Callback
{
public:
Callback () = default;
Callback (std::function<void(int)> f) { }
// Wish we knew the return type of std::bind()
// Callback (return_type_of_std_bind f) { }
};

void fn0 (std::function<void(int)> f) { }
void fn1 (Callback cb) { }

int main (void)
{
A a;
fn0(std::bind(&A::funcA, &a, _1)); // ok
fn1(std::function<void(int)>(std::bind(&A::funcA, &a, _1))); // ok, but verbose
fn1(std::bind(&A::funcA, &a, _1)); // concise, but won't compile
}

Вероятно, не актуально, но я использую gcc 4.7.2 в Linux.

1

Решение

Лучше всего дать Callback универсальный конструктор:

struct Callback
{
typedef std::function<void(int)> ftype;
ftype fn_;

template <typename T,
typename = typename std::enable_if<std::is_constructible<ftype, T>::value>::type>
Callback(T && f) : fn_(std::forward<T>(f))
{ }
};

(Я добавил второй аргумент шаблона по умолчанию, чтобы включить этот конструктор только для типов T для которого это утверждение имеет смысл, чтобы не создавать ложных свойств конвертируемости.) Обратите внимание, как этот метод удаляет одно неявное пользовательское преобразование из цепочки преобразования, вызывая явный конструктор для fn_,

11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]