指向重载成员函数的指针的 C++ 模板参数推导

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.

非常感谢。

康桓瑋*_*康桓瑋 6

您可以添加额外的模板boolCreateTestSuite()决定是否选择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)

演示。