【发布时间】:2021-10-18 07:02:26
【问题描述】:
我目前正在开发一个处理指向成员函数的指针的模板函数。它最初看起来像这样:
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 的细微修改。
非常感谢。
【问题讨论】:
-
带铸造
CreateTestSuite( static_cast<return_type (A::*)(...) /*const*/>(&A::test) ); -
@rafix07 感谢您的建议。但这对我来说不是很满意。如果 A::test 的参数列表很长,那我就得写很多了。
-
恐怕除了强制转换之外别无他法。您能否解释一下,作为人类,您想如何区分
CreateTestSuite(&A::test)此处写的内容?你会期待什么超载? -
对不起,我对这个问题的描述可能不是很清楚。我可以接受对
CreateTestSuite的细微修改。 -
你不能用
std::function吗?
标签: c++ templates overloading