Как передать константную функцию-член как неконстантную функцию-член - PullRequest
0 голосов
/ 03 декабря 2018

Как передать константную функцию-член в качестве неконстантной функции-члена в шаблон?

class TestA 
{
public:
    void A() {
    }

    void B() const {
    }
};

template<typename T, typename R, typename... Args>
void regFunc(R(T::*func)(Args...)) 
{}

void test() 
{
    regFunc(&TestA::A); // OK
    regFunc(&TestA::B); // ambiguous
}

Не хотите добавлять что-то вроде:

void regFunc(R(T::*func)(Args...) const)

Есть ли лучший способ?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Почему бы просто не передать его общей шаблонной функции:

посмотреть вживую

#include <iostream>
#include <utility>

class TestA
{
public:
    void A() { std::cout << "non-cost\n"; }
    void B() const { std::cout << "cost with no args\n"; }
    void B2(int a) const { std::cout << "cost with one arg\n"; }
    const void B3(int a, float f) const { std::cout << "cost with args\n"; }
};
template<class Class, typename fType, typename... Args>
void regFunc(fType member_fun, Args&&... args)
{
    Class Obj{};
    (Obj.*member_fun)(std::forward<Args>(args)...);
}

void test()
{
    regFunc<TestA>(&TestA::A); // OK
    regFunc<TestA>(&TestA::B); // OK
    regFunc<TestA>(&TestA::B2, 1); // OK
    regFunc<TestA>(&TestA::B3, 1, 2.02f); // OK
}

output :

non-cost
cost with no args
cost with one arg: 1
cost with args: 1 2.02
0 голосов
/ 03 декабря 2018

Нет, вы должны указать квалификаторы cv и ref для соответствия.R(T::*func)(Args...) - это отдельный тип для R(T::*func)(Args...) const для любого заданного R, T, Args....

Как примечание по терминологии, оно не неоднозначное .Есть ровно один кандидат, он не совпадает.Неоднозначность требует нескольких подходящих кандидатов.

...