gpt4 book ai didi

c++ - 模板函数参数继承

转载 作者:太空狗 更新时间:2023-10-29 21:26:58 24 4
gpt4 key购买 nike

我有一个可以返回任何类型的调度程序,接受一个命令和一个 FormData 对象。这个想法是我希望在传递特定内容时从 FormData 继承。

struct FormData {};

struct Form : FormData {};

void login(const Form *f){}

enum Command
{
LOGIN
};

template <typename T>
T dispatch(const Command command, const FormData *f)
{
switch (command)
{
case LOGIN: login(f);
}

return T();
}

int main()
{
Form f;

dispatch<void>(LOGIN, &f);

return 0;
}

我收到一条错误消息,提示无法从 Form 转换为 FormData。我拿走了模板,一切正常(但我需要模板)

最佳答案

FormData 类是基类,Form 是派生类,但是您的login 函数看起来像

void login(const Form *f){}

但是在你的调度函数中,你试图传递一个基类指针

T dispatch(const Command command, const FormData *f)
{
switch (command)
{
case LOGIN: login(f);
}

C++ 根本不允许您这样做。 Form* 可以隐式转换为 FormData*,但反之则不行。

也许你可以向调度函数添加另一个模板参数,并让该函数在编译时确定具体类型:

struct FormData {};

struct Form : public FormData {};

void login(const Form *f){}

enum Command
{
LOGIN
};

template <typename T>
T dispatch(const Command command)
{
return T();
}

template <typename T, typename FormDataType>
T dispatch(const Command command, const FormDataType *f)
{
switch (command)
{
case LOGIN: login(f);
}

return dispatch(command);
}

int main()
{
Form f;

dispatch<void>(LOGIN, &f);
dispatch<void>(LOGIN);
}

关于c++ - 模板函数参数继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10254343/

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