簡體   English   中英

使用模板類型作為 std::invoke 的參數

[英]Using template type as argument to std::invoke

考慮這段代碼:

using namespace std;

struct FS
{
    void print() { cout << "p\n"; }
    int s;
};

template <typename T, typename F>
void myInvoke(T& t, F f)
{
    invoke(f, t) = 10;
}

int main(int, char**) 
{
    FS fs;

    myInvoke(fs, &FS::s);

    cout << fs.s << "\n";
}

有沒有辦法避免將class 成員指針傳遞給myInvoke的運行時成本?

我當然可以:

template <typename T>
void myInvoke(T& t)
{
    invoke(&T::s, t) = 10;
}

// then call with
myInvoke(fs);

我想做的事:

template <typename T, typename P, P FS::* f>
void myInvoke(T& t)
{
    invoke(f, t) = 30;
}

// call with:
myInvoke<FS, int ,&FS::s>(fs);

但沒有類型名 P 有什么方法可以使調用更簡潔,以便可以通過以下方式調用:

myInvoke<FS, &FS::s>(fs);

我知道這有點神秘,但盡可能簡潔真的很好。 尤其是當您擁有廣泛使用的庫函數時。

編輯:鏈接到上面代碼的沙箱: https://godbolt.org/z/z4cGdPd3r

看來您正在尋找推斷的非類型 模板參數(帶有auto )(C++17):

template <auto F, typename T>
void myInvoke(T& t)
{
    invoke(F, t) = 10;
}

用法:

myInvoke<&FS::s>(fs);

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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