使用此函数的cv限定参数创建函数模板

时间:2017-09-24 10:48:50

标签: c++ templates pointers

我有一个功能模板:

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

我有一些类,我想稍后在我的函数中使用它作为xClass。但是它们的成员函数有不同的const限定符:

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”错误。 Howewer,添加“const”限定符:

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

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

是否有一种简单的方法可以使函数foo()“注意”成员函数指针的cv限定符?我尝试使用reinterpret_cast来为成员函数提供所有必要的指针,类似于cv-qualified:

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

但失败了。

1 个答案:

答案 0 :(得分:0)

一种方法是使foo函数更通用,以便它只需要任何类型的成员指针:

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

这意味着foo将接受指向具有除您想要的签名以外的签名的数据成员或成员函数的指针,但它通常不是那么大的问题。如果传递了错误类型的成员,通常只会出现编译错误,因为无法按照调用它的方式调用成员函数。如果您想进一步限制它,可以使用SFINAE技巧。