c++ - 指向重载成员函数的指针的 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
.
非常感谢。
解决方案
您可以添加一个额外的模板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);
推荐阅读
- python - 如何在序列中分离最长的重复字符模式,其中每个模式可以被未知数量的字符分隔?
- html - 如何根据下拉值进行路由?
- html - 在标签内设置图像样式
- javascript - 停止内部锚标记函数调用外部输入字段函数javascript
- python - 使用日期时间索引切片数据帧
- regex - 如何仅匹配和标记两个单词,但它们之间有一个字符串?
- hololens - 如何让媒体投射在 HoloLens 1 上工作
- android - Firestore 在上一个任务未完成之前不会加载数据。无法设置加载优先级
- python - 需要更好的套接字超时条件
- java - 将类对象列表映射到另一个列表