使用此功能的CV合并参数制作功能模板

Making a function template with cv-qualified arguments of this function

本文关键字:功能 数制 参数 CV 合并      更新时间:2023-10-16

我有一个函数模板:

template < typename A, typename B, typename xClass, typename D>
void foo(A& a, B& (xClass::*fooPtr)(D& d));
{
//some code
}

我有一些类,我想以后用作功能中的XCLASS。但是他们的成员功能具有不同的const-qualifier:

const out_t& Class1::foo1(in_t) const // (1)
out_t& Class1::foo1(in_t) // (2) just non-const version of foo1(), making the same actions
out_t& Class2::foo2(in_t) const // (3)

现在,如果我使用

... B& (xClass::*fooPtr)(D& d) ...

在函数模板中,仅指向(2)成员函数的指针使foo()起作用,而其他指针会导致"不兼容的CV-Qualifiers"错误。HOWER,添加" const"预选赛:

... B& (xClass::*fooPtr)(D& d) const ...

使(3)工作,但是现在(2)((1))也会导致错误。

有没有一种简单的方法使函数foo()以"不注意"指示器的"不注意" cv Qualifiers to成员函数?我试图使用reinterpret_cast,以使所有必要的指针用于成员函数类似的CV合格:

typedef B& out_t& (Class1::*fooPtr)(in_t) const;
fooPtr myPtr = reinterpret_cast<fooPtr>(&Class1::foo1);

但失败了。

一种方法是使您的 foo功能更一般,因此它仅采用任何类型的成员指针:

template < typename A, typename F, typename xClass>
void foo(A& a, F xClass::*fooPtr)
{
//some code
}

这意味着foo将接受除您想要的签名以外的数据成员或成员功能的指示,但通常并不是一个大问题。如果您通过错误的成员类型,通常只会遇到汇编错误,因为无法以您调用的方式调用成员函数。如果您想更限制它,可以使用Sfinae技巧。