2017-07-27 172 views
0

我以前這裏的問題Variadic template, function as argument調用帶有一個成員函數可變參數模板函數基於

我已經結束了下面一個簡單的類,但我怎麼使用std ::調用或一些其他方法來調用測試: :用Tester :: simple作爲參數測試? http://en.cppreference.com/w/cpp/utility/functional/invoke#Example提供的例子對我來說不是很有幫助,我嘗試了很多不同的使用std :: invoke的方法。

class Tester { 
public: 
    template<typename F, typename... Args> 
    decltype(auto) test(F&& f, Args&&... args) { 
     return std::forward<F>(f)(std::forward<Args>(args)...); 
    } 
    int simple(int i) { return i; } 
}; 

int main() 
{ 
    Tester t; 
    std::cout << t.test(t.simple, 3); // how do you modify this line such that the code compiles? 
} 

謝謝!

回答

2

一種方法是修改test()成員函數的定義,像這樣:

class Tester { 
public: 
    template<typename F, typename... Args> 
    decltype(auto) test(F&& f, Args&&... args) { 
     return std::invoke(std::forward<F>(f), std::forward<Args>(args)...); 
    } 
    int simple(int i) { return i; } 
}; 

然後,我們可以通過一個成員函數指針test(),與該方法應該被稱爲第二個實例參數,然後函數的參數本身:

int main() 
{ 
    Tester t; 
    std::cout << t.test(&Tester::simple, t, 3); 
} 

這部作品的原因是因爲std::invokespecial overload for pointers-to-members,這樣

std::invoke(ptr-to-member, instance, args...); 

被稱爲

(instance.*ptr-to-member)(args...); 

這正是我們希望在這種情況下。

1

請注意,std::invoke的一部分C++ 17。在如果沒有可用的情況下,所以它接受一個可能實現的test功能指針到成員函數和一個類的實例:

template<typename F, typename T, typename... Args> 
decltype(auto) test(F f, T&& t, Args&&... args) { 
    return (std::forward<T>(t).*f)(std::forward<Args>(args)...); 
} 

現在test接受指針TO-成員函數作爲第一個參數,作爲第二個參數的類的實例和任意數量的附加參數。

然後test可能被稱爲像:

Tester t; 
std::cout << t.test(&Tester::simple, t, 42); 

WANDBOX EXAMPLE

+0

現在它與非成員函數不兼容。試試't.test(放,「你好!」)'。 –

+0

@HenriMenke確實如此。據我所知,OP在這個問題上有興趣處理成員函數。所以我爲成員函數添加了一個簡單的解決方案。現在,OP可以自由結合他的問題解決方案來實現所需的功能。或者,如果他的編譯器允許他這樣做,只需使用'std :: invoke'即可:) –

1

僅舉另一種可能性,你可以包裹成員函數調用一個lambda並捕獲實例t。在C++ 14中,我們可以使用通用lambda表達式,所以我們不必明確指定參數。

#include <iostream> 
#include <utility> 

class Tester { 
public: 
    template<typename F, typename... Args> 
    decltype(auto) test(F&& f, Args&&... args) { 
     return std::forward<F>(f)(std::forward<Args>(args)...); 
    } 
    int simple(int i) { return i; } 
}; 

int main() 
{ 
    Tester t; 
    std::cout << t.test([&t] (auto&&... args) { return t.simple(std::forward<decltype(args)>(args)...); }, 3); 
} 
相關問題