使用模板访问成员变量

Access Member Variables using templates

我需要一个模板函数,它可以用于访问成员变量和操作该成员变量中存在的函数的通用目的。我有一组函数要调用,这将解决我的目的。

我试过以下方法

class Utilities {
public:
template<typename Container, typename MemberVar, typename Operator>
static void for_all(Container& C, MemberVar memvar, Operator Op) {
    for (auto& element : C) {
        (element.memvar->Op)();
    }
 }
};

我有以下测试代码,其中 class 测试具有 PrivateImpl 和 DataStructure 持有该 privatimpl。 下面是用privateimpl的打印函数

调用Utilities::for_all函数的打印函数
void Test::print() {
    ::Utilities::for_all(m_vec_struct_privateimpl,&Test::Struct_PrivateImpl::m_privateimpl,&Test::CPrivateImpl::print);
}

以下是所有 classes

的详细信息
// Main Class
class Test {
public:
    Test();
    ~Test();
    void print();
private:
    class CPrivateImpl;
    struct Struct_PrivateImpl;
    std::vector<Struct_PrivateImpl> m_vec_struct_privateimpl;
}; //class Utilities

// Class PrivateImpl
class Test::CPrivateImpl {
public:
    CPrivateImpl(std::initializer_list<int>& lst) {
        for (auto& i : lst) {
            m_vec_int.push_back(i);
        }

    }
    void print(int i) {
        cout << i << " ";
    }
private:
    std::vector<int> m_vec_int;

}; //class Test::CPrivateImpl

// Data Structure having PrivateImpl
struct Test::Struct_PrivateImpl {
public:

    Struct_PrivateImpl(int i) {
        m_privateimpl = std::make_shared<Test::CPrivateImpl>(std::initializer_list<int>{100+i,200+i,300+i});

    };
    ~Struct_PrivateImpl() {
    }

//private:
    std::shared_ptr<CPrivateImpl> m_privateimpl;
}; // class WiperSkeletonSomeIP::Struct_PrivateImpl

Test::Test(){
    for(auto i = 0u; i != 3; ++i) {
        Struct_PrivateImpl a_struct_pvtimpl(i);
        m_vec_struct_privateimpl.push_back(a_struct_pvtimpl);
    }
}
void Test::print() {
        ::Utilities::for_all(m_vec_struct_privateimpl,&Test::Struct_PrivateImpl::m_privateimpl,&Test::CPrivateImpl::print);
    }    

// This is the main function
int main() {
    Test t;
    t.print();
}

我收到错误消息说 memvar 有函数 Op。

这是一个示例代码我在 PrivateImpl 中有很多函数要调用 class。

请帮我解决这个问题。

通过成员指针访问的语法是.*->*:

class Utilities {
public:
    template <typename Container, typename MemberVar, typename Operator>
    static void for_all(Container& C, MemberVar memvar, Operator Op)
    {
        for (auto& element : C) {
            ((*(element.*memvar)).*Op)();
        }
    }
};

Demo