2012-04-15 2 views
6
std::tr1::_Bind<void (*()(std::tr1::reference_wrapper<int>))(int&)> 

Я понимаю std::tr1::reference_wrapper<int> и вся эта вещь какая-то указатель на функцию, которая возвращает void и принимает int& в качестве аргумента. Но я не могу следовать за *() в начале. Кодирование, вырезанное из некоторого сеанса gdb, прошло некоторое время назад.Что это за шаблон в этом шаблоне?

Кроме того, что это за тип tr1 :: function? Некоторая функция, которая возвращает void и не принимает аргументов?

0x00000001000021a1 in std::tr1::function<void()()>::operator() (this=0x7fff5fbffb98) at functional_iterate.h:865 

Но тогда следующая ошибка:

template <typename T> 
void f() 
{ 
    cout << "general\n"; 
} 

template<> 
void f<void()()>() // this is error 
{ 
    cout << "specific\n"; 
} 

ответ

4

Это экземпляр std::tr1::_Bind экземпляра от типа функции, принимая std::tr1::reference_wrapper<int> и возвращающая указатель на функцию, принимающую ссылку на Int и возвращение пустоты.

Вот как читать:

  • std::tr1::_Bind<типа> должно быть ясно.
  • типа = void (п)(int&) функция принимает int& и возвращение void.
  • п = *PTR так что на самом деле указатель на функцию
  • PTR = (fn2)(std::tr1::reference_wrapper<int>) функция принимает std::tr1::reference_wrapper<int> и то, что мы имели до сих пор является его тип возврата.
  • fn2 = (пусто), потому что мы не даем этой функции (типа) имя.

Однако, как я теперь замечаю, когда fn2 пуст, круглые скобки вокруг него, вероятно, следует также не быть там (подобно тому, как вы пишете функцию «не принимая никаких параметров и возвращение пустоты» тип функции, как void(), . не void()()

дело в std::tr1::function точно, что один: функция не принимает никаких параметров и возвращение void с дополнительными скобками вокруг пустого «имя функции»

ОК, теперь тестировал:. GDB действительно выводит void() как void()(); это, вероятно, следует считать ошибкой gdb.

Правильный способ записи первого типа в C++ поэтому:

std::tr1::_Bind<void (*(std::tr1::reference_wrapper<int>))(int&)> 
+0

не должны быть звездой между двумя скобкой для этого? – 6502

+0

@ 6502: Нет, потому что звезда принадлежит * возвращаемому типу * функции (которая сама является функцией, а для функции *, что звезда действительно находится внутри соответствующих круглых скобок. – celtschk

+0

@ Fanatic23: Я уже писал об этом. Это заняло некоторое время. – celtschk