[英]Member Variable Pointer
對於給定的結構:
struct foo
{
void fooFunc(){}
int fooVar = 0;
};
我可以創建函數的調用包裝器: std::mem_fn( &foo::fooFunc )
,以便可以將其傳遞到另一個方法中並在對象上調用它。
我想知道是否有類似的調用包裝,但成員變量除外。
例如,我在這里使用一個指向成員變量的指針,但是我想使用一個調用包裝器:
void bar( std::function< void( foo ) > funcPtr, int foo::* varPtr )
{
foo myFoo;
funcPtr( myFoo );
foo.*varPtr = 13;
}
除了成員函數之外, std::mem_fn
也可以包裝數據成員,並允許對其進行讀取訪問。 因此,以下工作原理:
void print_fooVar(foo& f, std::function<int(foo)> varAccess)
{
std::cout << varAccess(f) << std::endl;
}
foo f;
print_fooVar(f, std::mem_fn(&foo::fooVar)); // prints 0
正如JonathanWakely在評論中提到的那樣,您可以使用mem_fn
本身返回的(未指定)類型來設置數據成員。
foo f;
std::mem_fn(&foo::fooVar)(f) = 13;
或將其轉換為std::function
使用
void bar( foo& f, std::function<int&(foo&)> fooVarSet )
{
fooVarSet(f) = 26;
}
如果您要尋找的只是一種生成可調用的方式來設置fooVar
數據成員的方法,而無需專門使用std::mem_fn
來執行此操作,則也可以使用lambda表達式來完成這項工作。
void bar( foo& f, std::function<void(foo)> funcPtr,
std::function<void(foo&, int)> fooVarSet )
{
funcPtr( f );
fooVarSet(f, 13);
}
foo f;
bar(f, std::mem_fn(&foo::fooFunc), [](foo& f, int i) {f.fooVar = i;});
注意:您的問題什么都不來自STL(這是1990年代的庫), std::function
和std::mem_fn
屬於C ++標准庫的一部分,不是同一回事。
std::mem_fn
支持成員函數和成員變量,因此您可以執行以下操作來訪問成員變量並進行設置:
foo f;
std::function<int&(foo&)> var( std::mem_fn( &foo::fooVar ) );
var(f) = 1;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.