Передача подписи метода в качестве параметра шаблона в класс - PullRequest
8 голосов
/ 01 марта 2010

Я хотел бы создать шаблонный интерфейс для классов обработки данных в моих проектах.

Я могу написать что-то вроде этого:

template <class T>
class DataHandler
{
    public:
        void Process(const& T) = 0;
};

Тогда, предположим, я определяю класс следующим образом:

class MyClass: public DataHandler<int> 
{
    void Process(const int&) { /* Bla-bla */ }
}

Теперь встает вопрос, могу ли я как-то определить интерфейс моего шаблона таким образом, чтобы в качестве параметра он получал не просто тип T, а всю сигнатуру функции Process ().

Я бы хотел, чтобы что-то работало так:

class MyClass: public DataHandler<void (int&)> 
{
    void Process(const int&) { /* Bla-bla */ }
}

Возможно ли это? Я знаю, что, например, boost :: signal получает параметры шаблона таким образом, но, если я правильно понимаю, они используют там много черной магии.

1 Ответ

12 голосов
/ 01 марта 2010

Да, вы можете. Но в C ++ 03 вы обязаны делать код копирования / вставки для каждого числа параметров (не так уж и плохо, поскольку здесь вам не понадобятся перегрузки для const / non-const и т. Д. Constnes уже известен!).

template<typename FnType>
struct parm;

template<typename R, typename P1>
struct parm<R(P1)> {
  typedef R ret_type;
  typedef P1 parm1_type;
};

template <class T>
class DataHandler
{
    typedef typename parm<T>::ret_type ret_type;
    typedef typename parm<T>::parm1_type parm1_type;

    public:
        virtual ret_type Process(parm1_type t) = 0;
};

class MyClass: public DataHandler<void (const int&)> 
{
    void Process(const int&) { /* Bla-bla */ }
};

В C ++ 0x вы сможете написать

template <class T>
class DataHandler;

template<typename R, typename ... P>
class DataHandler<R(P...)> 
{
    public:
        virtual R Process(P... t) = 0;
};

class MyClass: public DataHandler<void (const int&)> 
{
    void Process(const int&) { /* Bla-bla */ }
};

Сколько приятнее!

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