gpt4 book ai didi

c++ - 使用成员字段调用可变类模板的成员方法

转载 作者:太空狗 更新时间:2023-10-29 21:35:44 25 4
gpt4 key购买 nike

我了解了一些关于可变参数模板的知识,并在 Internet 上搜索了一些示例,现在尝试编写一些棘手的代码来调用成员一个可变参数类模板的方法及其字段之一。我不明白为什么它不起作用。请帮忙。

这是示例类:

class BarBase
{
public:
BarBase() = default;

virtual void call() = 0;
};

template<typename O, typename M, typename... A>
class Bar
: public BarBase
{
public:
Bar(O* o, M m, A&&... a)
: BarBase()
, m_o(o), m_m(m), m_a(std::forward<A>(a)...)
{ }

void call() override final
{
callInnerWithArgsInside();
}

private:
void callInnerWithArgsInside()
{
(m_o->*m_m)(m_a); // Some errors happends here
}

O* m_o;
M m_m;
std::tuple<typename std::remove_reference<A>::type...> m_a;
};

template<typename O, typename M, typename... A>
BarBase* crateBar(O* o, M m, A&&... a)
{
return new Bar<O, M, A...>(o, m, std::forward<A>(a)...);
}

然后从 main 调用:

struct Foo
{
void foo(int ii, float ff, std::string ss)
{
std::cout << "called" << std::endl;
}
};

int main()
{
Foo f;
int i = 10;
float ff = 20.2f;
std::string s = "Hello";

BarBase* bar = crateBar(&f, &Foo::foo, i, ff, s);
bar->call();
}

错误:

主要.cpp

1>d:\drafts_tests\main.cpp(203): error C2198: 'void (__thiscall Foo::* )(int,float,std::string)' : 调用参数太少

1> d:\drafts_tests\main.cpp(202) : 在编译类模板成员函数 'void Bar::callInnerWithArgsInside(void)' 时

1>与

1> [

1> O=富

1> , M=void (__thiscall Foo::* )(int,float,std::string)

1> ]

1> d:\drafts_tests\main.cpp(197) : 参见正在编译的函数模板实例 'void Bar::callInnerWithArgsInside(void)' 的引用

1>与

1> [

1> O=富

1> , M=void (__thiscall Foo::* )(int,float,std::string)

1> ]

1> d:\drafts_tests\main.cpp(214) : 查看正在编译的类模板实例化“Bar”的引用

1>与

1> [

1> O=富

1> , M=void (__thiscall Foo::* )(int,float,std::string)

1> ]

1> d:\drafts_tests\main.cpp(225) : 参见正在编译的函数模板实例化 'BarBase *crateBar(O *,M,int &,float &,std::string &)' 的引用

1>与

1> [

1> O=富

1> , M=void (__thiscall Foo::* )(int,float,std::string)

1> ]

========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

最佳答案

您正在将一个元组传递给函数,而不是单个类型参数。以下将向调用传递所需的类型参数:

template<std::size_t... I>
void callInnerWithArgsInside2(std::index_sequence<I...>)
{
(m_o->*m_m)(std::get<I>(m_a)...);
}

void callInnerWithArgsInside()
{
return callInnerWithArgsInside2( std::make_index_sequence<sizeof...(A)>());
}

live demo


EDIT1:C++11 版本

我已经实现了 C++11 版本,参见 updated live demo

关于c++ - 使用成员字段调用可变类模板的成员方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41649604/

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