首页 > 解决方案 > 指向重载成员函数的指针的 C++ 模板参数推导

问题描述

我目前正在研究一个处理指向成员函数的指针的模板函数。它最初看起来像这样:

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 和 non-const 的两个不同的成员函数,它工作正常。但是,如果我尝试调用CreateTestSuite一个指向重载成员函数的指针,就会出现问题。

例如,假设我有以下 A 类:

class A
{
public:
    return_type test(...) {...}
    return_type test(...) const {...}
};

现在当我尝试进行函数调用时

CreateTestSuite(&A::test);

编译器将无法判断我使用的是哪个重载版本。此外,这个问题不能通过显式指定模板参数来解决,因为它们对于CreateTestSuite.

如何从两个版本中明确选择?

编辑: 我可以接受对CreateTestSuite.

非常感谢。

标签: c++templatesoverloading

解决方案


您可以添加一个额外的模板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)
{ }

然后你可以明确指定IsConst调用CreateTestSuite()

CreateTestSuite(&A::test);
CreateTestSuite<true>(&A::test);
CreateTestSuite<false>(&A::test);

演示。


推荐阅读