Как автоматически вывести тип возвращаемого значения из типа функции? - PullRequest
3 голосов
/ 22 июня 2011

Я использую boost::python для создания оболочки Python библиотеки C ++. В какой-то момент boost::python нужен указатель на функцию-член (или что-то совместимое), например:

template <class MyClass, typename ValueType>
void (*setter_function)(MyClass&, ValueType)

// This doesn't compile, but you got the idea.
my_boost_python_call(setter_function f);

Так как класс, который я упаковываю, имеет свой установщик в следующем виде:

template <class MyClass, typename ValueType>
MyClass& (MyClass::*setter_method)(ValueType)

Я написал одну функцию преобразования:

template <typename MyClass, typename ValueType, setter_method<MyClass, ValueType> fluent_setter>
void nonfluent_setter(MyClass& instance, ValueType value)
{
  (instance.*fluent_setter)(value);
}

Что я могу использовать так:

class Foo
{
  public:

    Foo& bar(int value);
};

my_boost_python_call(nonfluent_setter<Foo, int, &Foo::bar>);

Пока это работает хорошо, но мне интересно, есть ли способ сделать это еще более "легким" (использовать).

Как вы думаете, возможно ли получить что-то вроде:

// return type is somehow inferred from the member function pointer
my_boost_python_call(nonfluent_setter<Foo, &Foo::bar>);

// or even a syntax similar to boost::python::make_function
my_boost_python_call(make_nonfluent_setter<Foo>(&Foo::bar));

Все решения (даже те, которые объясняют, как специализировать boost::python для обработки моего конкретного случая) приветствуются.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 19 сентября 2012

На самом деле можно вывести тип возврата функции, используя операторы приведения - я описываю это здесь .

Вот краткая версия:

struct ReturnType {
  template<typename T>
  operator T() {
    // your code for return a T goes here.
  }
};
ReturnType func() { return ReturnType(); }

Здесь компилятор выведет значение T, таким образом, тип возврата func также выводится.

2 голосов
/ 22 июня 2011

Тип возвращаемого значения не может быть автоматически выведен в C ++, и вы не можете перегружать функции в зависимости от типа возвращаемого значения.

В C ++ 0x есть новая функция под названием decltype , которая может представлять интерес.

...