我目前正在研究處理指向成員函式的指標的模板函式。它最初是這樣的:
template <typename C, typename RT, typename... P>
auto CreateTestSuite(RT(C::* pFunc)(P...))
{...}
但是,我很快發現,如果我嘗試將指向 const 成員函式的指標傳遞給它,模板將無法識別這一點。所以我然后添加了這個多載版本:
template <typename C, typename RT, typename... P>
auto CreateTestSuite(RT(C::* pFunc)(P...) const)
{...}
對于分別具有 const 和非常量的兩個不同成員函式,它作業正常。但是,如果我嘗試呼叫CreateTestSuite指向多載成員函式的指標,就會出現問題。
例如,假設我有以下 A 類:
class A
{
public:
return_type test(...) {...}
return_type test(...) const {...}
};
現在當我嘗試進行函式呼叫時
CreateTestSuite(&A::test);
編譯器將無法判斷我使用的是哪個多載版本。此外,這個問題不能通過顯式指定模板引數來解決,因為它們對于 的多載版本是相同的CreateTestSuite。
如何從兩個版本中明確選擇?
編輯:
我可以接受對CreateTestSuite.
非常感謝。
uj5u.com熱心網友回復:
您可以添加一個額外的模板bool來CreateTestSuite()決定是否選擇const-qualified 成員函式:
#include <type_traits>
template <bool IsConst = false, typename C, typename RT, typename... P>
auto CreateTestSuite(RT(C::* pFunc)(P...), std::enable_if_t<!IsConst>* = nullptr)
{ }
template <bool IsConst, typename C, typename RT, typename... P>
auto CreateTestSuite(RT(C::* pFunc)(P...) const, std::enable_if_t<IsConst>* = nullptr)
{ }
然后您可以明確指定IsConst呼叫CreateTestSuite():
CreateTestSuite(&A::test);
CreateTestSuite<true>(&A::test);
CreateTestSuite<false>(&A::test);
演示。
uj5u.com熱心網友回復:
由于您的問題只是選擇正確的多載,您可以撰寫助手:
template <typename C, typename RT, typename... P>
constexpr auto non_const_overload(RT (C::*pFunc)(P...)) { return pFunc; }
template <typename C, typename RT, typename... P>
constexpr auto const_overload(RT (C::*pFunc)(P...) const) { return pFunc; }
隨著使用
CreateTestSuite(non_const_overload(&A::test));
CreateTestSuite(const_overload(&A::test));
演示
注意:您可能需要 24 個助手來處理與volatile, 參考此和 C 省略號的所有組合。
或 MACRO(立即呼叫 c 20 lambda):
#define OVERLOAD(name, /*qualifiers*/...) []<typename C, typename RT, typename... P>(RT (C::*pFunc)(P...) __VA_ARGS__){ return pFunc; }(name)
CreateTestSuite(OVERLOAD(&A::test)); /*no const*/
CreateTestSuite(OVERLOAD(&A::test,)); /*no const*/
CreateTestSuite(OVERLOAD(&A::test, const));
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/326451.html
