簡體   English   中英

成員變量指針

[英]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::functionstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM