我有一个可以返回任何类型,接受命令和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派生的,但是您的登录功能看起来像

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/

10-13 09:33