Как я могу создать переменную того же типа, что и данная функция? - PullRequest
8 голосов
/ 11 мая 2011

У меня есть функция C ++, такая как

int f( const std::string &s, double d );

Теперь я хотел бы создать переменную, которая содержит указатель на f. Эта переменная должна иметь правильный тип (int (*)( const std::string &, double ) - но я не хочу явно записывать этот тип. Я хотел бы вывести его из f, чтобы не повторять сигнатуру типа. В конце концов, я хотел бы иметь возможность написать что-то вроде:

TypeOf<f>::Result x = f;

Чтобы добиться этого, я пытался сделать что-то вроде этого:

// Never implemented, only used to deduce the return type into something which can be typedef'ed
template <typename T> T deduceType( T fn ); 

template <typename T>
struct TypeOf {
    typedef T Result;
};

// ...
TypeOf<deduceType(f)>::Result x = f;

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

Кто-нибудь знает, как это сделать? Я ищу решение C ++ 03.

Ответы [ 4 ]

10 голосов
/ 11 мая 2011

C ++ 0x добавлено decltype , которое делает то, что вы хотите (если я правильно понял).

Другим вариантом может быть Boost :: Typeof , который предназначен для обеспечения тех же функций, пока decltype не поддерживается во всех компиляторах.

0 голосов
/ 11 мая 2011

Лучше использовать typedef.Вы можете повторить имя typedef вместо всей сигнатуры функции.

В большинстве случаев typeof не очень хорошая идея, даже если вы можете это сделать.

typedef int (*FuncType)( const std::string &s, double d );
0 голосов
/ 11 мая 2011

Если вы застряли с текущим стандартом, используйте BOOST_TYPEOF - ala:

#include <iostream>
#include <boost/typeof/typeof.hpp>

struct foo
{
  int f( const std::string &s, double d ){ std::cout << "foo::f()" << std::endl; return 0;}
};

int main(void)
{
  BOOST_TYPEOF(&foo::f) x = &foo::f;

  foo f1;

  std::string s("he");

  (f1.*x)(s, 0.); 
}
0 голосов
/ 11 мая 2011

Вы можете объявить вашу переменную следующим образом:

int (*FuncPtr)(const std::string& s, double d);

Здесь FuncPtr - это ваша переменная.и вы можете использовать его как: int result = FuncPtr(str, d);, при условии, что FuncPtr не NULL.Для этого вы можете сделать:

int result = 0;
if (FuncPtr)
{
   result = FuncPtr(str, doubleValue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...