Как обернуть объект и его функции-члены с помощью C ++ - PullRequest
0 голосов
/ 29 февраля 2020

Я разрабатываю класс c ++ для переноса объекта и его функций-членов. Как объект может быть изменен, так что я думаю, возможно ли использовать какой-то механизм, например шаблон. Вот пример:

class ObjectA
{
public:
    void funcA1(double);
    void funcA2(int, char);
private:
    int value;
};

class ObjectB
{
public:
    void funcB1(double);
    void funcB2(int, char);
private:
    int value;
    float point;
};

Теперь мне нужно разработать класс, который может легко обернуть ObjectA или ObjectB. Конечно, ObjectA и ObjectB не наследуют ни один родительский класс, и они должны иметь две функции, имена функций не совпадают, но параметры должны быть одинаковыми, как и funcA1 funcB1 и funcA2 funcB2.

Я думаю, что код, приведенный ниже, должен работать.

template<typename T, typename funcAT, typename funcBT> // T: Object, funcAT: Object::funcA, funcBT: Object::funcB
class Wrapper
{
    // ...
};

Хорошо, если код работает, есть ли какой-нибудь метод, чтобы сделать больше ограничений? Например, как убедиться, что funcAT должен принадлежать T, а не другим функциям? как убедиться, что funcAT должен иметь только один параметр double вместо других случаев?

Что я имею в виду:

ObjectA objA;
Wrapper<objA, objA::funcA1, objA::funcB1> wrapper; // no error
Wrapper<objA, other_funcA, other_funcB> wrapper; // ERROR

1 Ответ

0 голосов
/ 29 февраля 2020

Указатели на функции-члены могут go напрямую в качестве параметров шаблона:

template<typename T, void (T::*f1)(double), void (T::* f2)(int, char)>
class Wrapper
{
    // ...
};

Wrapper< ObjectA, &ObjectA::funcA1, &ObjectA::funcA2> w;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...