C++::使用模板技巧访问多个私有(private)成员

标签 c++ templates metaprogramming

我正在研究以下帖子access private member using template trick 。 我想知道应该如何修改代码才能访问多个私有(private)变量 我尝试了以下方法

#pragma once
template<typename Tag, typename Tag::type M>
struct Rob {
    friend typename Tag::type get( typename Tag::type) {
        return M;
    }
};
// use
struct A {
    A(int a) :a(a) { }
private:
    int a;
    int b;
};

// tag used to access A::a
template<typename Tag, typename Member>
struct TagBase {
    typedef Member type;
    friend type get(Tag);
};

struct A_f : TagBase<A_f, int A::*> { };
template struct Rob<A_f, &A::a>;
template struct Rob<A_f, &A::b>;

int main() {
   A a(42);
   std::cout << "proof: " << a.*get(A_f()) << std::endl;
}

但我收到以下错误

error C2084: function 'int A::* Rob<A_f,pointer-to-member(0x0)>::get(int A::* )' already has a body
 message : see previous definition of 'get'
 message : see reference to class template instantiation 'Rob<A_f,pointer-to-member(0x4)>' being compiled

这是link前往演示

最佳答案

这是因为 typename Tag::type 都是 int A::*,因此两个实例化都定义了相同的函数。

要解决此问题,您需要稍微更改示例,以便它使用多种标记类型:

#include <iostream>
 
template<typename Tag, typename Tag::type M>
struct Rob {
    // Here we receive tag directly
    friend typename Tag::type get(Tag) {
        return M;
    }
};
 
// use
struct A {
    A(int a) :a(a) { }
private:
    int a;
    int b;
};
 
// tag used to access A::a
template<typename Tag, typename Member>
struct TagBase {
    typedef Member type;
    friend type get(Tag);
};
 
struct A_af : TagBase<A_af, int A::*> { };
struct A_bf : TagBase<A_bf, int A::*> { };
 
template struct Rob<A_af, &A::a>;
template struct Rob<A_bf, &A::b>;
 
int main() {
    A a(42);
    std::cout << "proof: " << a.*get(A_bf()) << a.*get(A_af()) << std::endl;
}

关于C++::使用模板技巧访问多个私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65146769/

相关文章:

c++ - 可以为了速度牺牲常量正确性吗?

templates - GitHub - 用于复制设置和标签的模板存储库

c++ - 如何专门化 std::vector<T> 的模板成员函数

用于元编程的 C++ STL 函数等价物

c++ - Opencv 比较图像

C++ 模拟/测试 boost::asio::io_stream - 基于异步处理程序

c++ - 用于查找参数是否为类的不同模板语法

c++ - 如果模板类型也可以是字符串,如何将其转换为字符串?

python装饰器和方法

macros - 如何在 julia 中创建多行宏?