如何使用c ++包装对象及其成员函数

问题描述 投票:0回答:1

我正在开发一个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;
};

现在我需要开发一个可以轻松包装ObjectAObjectB的类。可以确定ObjectAObjectB不继承任何父类,并且它们必须具有两个函数,函数的名称不相同,但是参数必须相同,就像funcA1 funcB1funcA2 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
c++ c++11 templates
1个回答
0
投票

成员函数指针可以直接用作模板参数:

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

Wrapper< ObjectA, &ObjectA::funcA1, &ObjectA::funcA2> w;
© www.soinside.com 2019 - 2024. All rights reserved.