Gua*_* He 0 c++ templates overloading
我目前正在开发一个处理指向成员函数的指针的模板函数。它最初看起来像这样:
template <typename C, typename RT, typename... P>
auto CreateTestSuite(RT(C::* pFunc)(P...))
{...}
Run Code Online (Sandbox Code Playgroud)
然而,我很快发现,如果我尝试向它传递一个指向 const 成员函数的指针,模板将无法识别它。所以我然后添加了这个重载版本:
template <typename C, typename RT, typename... P>
auto CreateTestSuite(RT(C::* pFunc)(P...) const)
{...}
Run Code Online (Sandbox Code Playgroud)
对于分别具有 const 和 non-const 的两个不同的成员函数,它工作得很好。但是,如果我尝试调用CreateTestSuite指向重载成员函数的指针,则会出现问题。
例如,假设我有以下 A 类:
class A
{
public:
return_type test(...) {...}
return_type test(...) const {...}
};
Run Code Online (Sandbox Code Playgroud)
现在当我尝试进行函数调用时
CreateTestSuite(&A::test);
Run Code Online (Sandbox Code Playgroud)
编译器将无法判断我正在使用哪个重载版本。此外,这个问题不能通过显式指定模板参数来解决,因为它们对于CreateTestSuite.
如何从两个版本中明确选择?
编辑:
我可以接受对CreateTestSuite.
非常感谢。
您可以添加额外的模板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)
{ }
Run Code Online (Sandbox Code Playgroud)
然后你可以明确指定IsConst调用CreateTestSuite():
CreateTestSuite(&A::test);
CreateTestSuite<true>(&A::test);
CreateTestSuite<false>(&A::test);
Run Code Online (Sandbox Code Playgroud)