如何将 const 成员函数作为非常量成员函数传递
How to pass const member function as non-const member function
如何将常量成员函数作为非常量成员函数传递给模板?
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)
有没有更好的方法?
不,您必须指定要匹配的 cv 和 ref 限定符。对于任何给定的 R
、T
、Args...
.
,R(T::*func)(Args...)
是 R(T::*func)(Args...) const
的独立类型
作为术语说明,它没有歧义。只有一个候选人,它不匹配。歧义需要多个匹配候选项。
为什么不简单地将其传递给通用模板函数:
#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
}
输出:
non-cost
cost with no args
cost with one arg: 1
cost with args: 1 2.02
如何将常量成员函数作为非常量成员函数传递给模板?
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)
有没有更好的方法?
不,您必须指定要匹配的 cv 和 ref 限定符。对于任何给定的 R
、T
、Args...
.
R(T::*func)(Args...)
是 R(T::*func)(Args...) const
的独立类型
作为术语说明,它没有歧义。只有一个候选人,它不匹配。歧义需要多个匹配候选项。
为什么不简单地将其传递给通用模板函数:
#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
}
输出:
non-cost
cost with no args
cost with one arg: 1
cost with args: 1 2.02