return 指向在堆上创建的对象成员的指针
return a pointer to a member of an object that is created on the heap
所以如果我有 class
class Item {
public:
Item(int key, int value):key(key), value(value) {}
int GetValue() {
return value;
}
private:
int key;
int value;
}
如果我在堆上创建一个 Item 对象:
Item *item = new Item(1, 2);
是否可以获取指向该对象值成员的指针?
比如我有另一个方法class
int* GetValue(int k) {
Item* item = ...; // It finds the pointer to an Item object with key k that was created before.
// Is there anyway I can return the pointer to the value member of this item?
// Something like:
return &(item->GetValue()); // This won't compile because item->GetValue() is a r-value. Is there any alternative way to walk around?
}
尝试将这行代码添加到您的代码中。
template <class Tag, typename Tag::type Value>
struct Getter
{
friend typename Tag::type get(Tag) {
return Value;
}
};
struct Tag_item {
typedef int Item::*type;
friend type get(Tag_item);
};
int* GetValue(int k) {
static Item item(13, 14);
// std::cout << item.GetValue() << std::endl; // This line to test output.
return &(item.*get(Tag_item())); // If pItem is pointer then pItem->*get(Tag_item())
}
template struct Getter<Tag_item, &Item::value>;
在 http://coliru.stacked-crooked.com/a/3be5b80e848650c5
查看演示
归功于http://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.html by Johannes Schaub - litb
所以如果我有 class
class Item {
public:
Item(int key, int value):key(key), value(value) {}
int GetValue() {
return value;
}
private:
int key;
int value;
}
如果我在堆上创建一个 Item 对象:
Item *item = new Item(1, 2);
是否可以获取指向该对象值成员的指针?
比如我有另一个方法class
int* GetValue(int k) {
Item* item = ...; // It finds the pointer to an Item object with key k that was created before.
// Is there anyway I can return the pointer to the value member of this item?
// Something like:
return &(item->GetValue()); // This won't compile because item->GetValue() is a r-value. Is there any alternative way to walk around?
}
尝试将这行代码添加到您的代码中。
template <class Tag, typename Tag::type Value>
struct Getter
{
friend typename Tag::type get(Tag) {
return Value;
}
};
struct Tag_item {
typedef int Item::*type;
friend type get(Tag_item);
};
int* GetValue(int k) {
static Item item(13, 14);
// std::cout << item.GetValue() << std::endl; // This line to test output.
return &(item.*get(Tag_item())); // If pItem is pointer then pItem->*get(Tag_item())
}
template struct Getter<Tag_item, &Item::value>;
在 http://coliru.stacked-crooked.com/a/3be5b80e848650c5
查看演示归功于http://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.html by Johannes Schaub - litb