Повышение "подписи" вопроса - PullRequest
2 голосов
/ 16 июля 2010

Я пытаюсь выяснить, как многие классы Boost могут принимать сигнатуру функции в качестве аргумента шаблона, а затем "извлекать" оттуда тип результата, тип первого аргумента и т. Д.

template <class Signature>
class myfunction_ptr
{
   Signature* fn_ptr;
public:
   typedef /*something*/  result_type;  // How can I define this?
   typedef /*something*/  arg1_type;  // And this?
};

Я знаю, что boost также обеспечивает более переносимую реализацию, используя аргумент шаблона для каждого аргумента функции, и это легко понять.Может кто-нибудь объяснить мне магию за этим?

1 Ответ

6 голосов
/ 16 июля 2010

В основе его просто специализация и повторение:

template<class S> struct Sig;

template<class R> struct Sig<R ()> {
    typedef R result_type;
};

template<class R, class T0> struct Sig<R (T0)> {
    typedef R result_type;
    typedef T0 first_type;
};

// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...