gpt4 book ai didi

具有重载成员函数的 C++ std::mem_fn

转载 作者:可可西里 更新时间:2023-11-01 18:25:26 29 4
gpt4 key购买 nike

编译以下代码时,Visual Studio 报告:

\main.cpp(21): error C2664: 'std::_Call_wrapper<std::_Callable_pmd<int ClassA::* const ,_Arg0,false>,false> std::mem_fn<void,ClassA>(int ClassA::* const )' : cannot convert argument 1 from 'overloaded-function' to 'int ClassA::* const '
1> with
1> [
1> _Arg0=ClassA
1> ]
1> Context does not allow for disambiguation of overloaded function

为什么编译器在创建 mem_fptr1 时会感到困惑?但是当我指定类型时,一些 mem_fptr2 是可以的。

我可以创建指向不带参数的重载成员函数的成员函数指针吗?

class ClassA
{
public:
void memberfunction()
{
std::cout <<"Invoking ClassA::memberfunction without argument" << std::endl;
}

void memberfunction(int arg)
{
std::cout << "Invoking ClassA::memberfunction with integer " << arg << std::endl;
}
};

int main()
{
auto mem_fptr1 = std::mem_fn<void, ClassA>(&ClassA::memberfunction);
auto mem_fptr2 = std::mem_fn<void, ClassA, int>(&ClassA::memberfunction);

mem_fptr1(ClassA());
mem_fptr2(ClassA(), 3);
}

最佳答案

template overloads taking a variadic list of argument types在 C++11 中引入但在 C++14 中删除为 defect #2048 .指定特定重载的方法是指定一个函数类型作为第一个模板参数(第二个模板参数,类类型,可以省略,因为它可以推导):

auto mem_fptr1 = std::mem_fn<void()>(&ClassA::memberfunction);
auto mem_fptr2 = std::mem_fn<void(int)>(&ClassA::memberfunction);

然后函数类型R 与类类型T 组合为R T::* 以给出成员函数类型。这也允许将 std::mem_fn 形成为数据成员(其中 R 是非函数类型)。

请注意,您的代码(对于 mem_fptr2)在 C++14 中不起作用,其中采用可变参数类型列表的模板重载已被删除;上面的代码将适用于标准的两个版本。

另一种方法是执行成员函数转换;在这种情况下,您不需要为 mem_fn 指定模板参数:

auto mem_fptr1 = std::mem_fn(
static_cast<void (ClassA::*)()>(&ClassA::memberfunction));
auto mem_fptr2 = std::mem_fn(
static_cast<void (ClassA::*)(int)>(&ClassA::memberfunction));

关于具有重载成员函数的 C++ std::mem_fn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25765053/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com