0

有没有办法在这个例子中使用模板解决方案或其他东西?现在 C 类中的 parse() 函数返回类型不同,具体取决于使用的类型。

我有A类:

class A {

    std::vector<SomeClass*> parseData(const char *data);
}

然后我有B级

class B {

    std::string parseData(const char *data); }

然后我想在C类中调用正确的类方法:

class C {

    std::vector<SomeClass*> parse { A::parseData(_data); }
    std::string parse { B::parseData(_data); }

    void setData(std:string data) { _data = data; }

    std:string _data;
}

int main()
{
    C c1.setData(data_with_many_strings_and_numbers);
    C c2.setData(data_with_one_string);
    std::vector<SomeClass*> someClassData = c1.parse();
    std:string someString = c2.parse();
}
4

2 回答 2

0

如果这些调用执行不同的任务,您最好有两种单独的方法。考虑将此实现更改为以下类型:

class C {

    std::vector<SomeClass*> parseVector { A::parseData(_data); }
    std::string parseString { B::parseData(_data); }

    void setData(std:string data) { _data = data; }

    std:string _data;
}

int main()
{
    C c1.setData(data_with_many_strings_and_numbers);
    C c2.setData(data_with_one_string);
    std::vector<SomeClass*> someClassData = c1.parseVector();
    std:string someString = c2.parseString();
}
于 2013-03-17T19:44:44.090 回答
0

不,你不能按照你想做的方式去做你想做的事。解析本质上是一个运行时问题,你不能像那样决定要即时返回什么。您需要以某种方式直接或通过可以告诉您已阅读的类型的包装器以某种方式使类型返回子类型。然后,您可以注册具有责任链的解析器。注册这个责任链可以从模板化的函数调用中受益,但它需要将它们包装在一个类型隐藏的封装器中,而不是多态化你的静态类型以在这些类型中调用相同的命名函数(可能是浪费时间......也可以只是子类型一个抽象基础,除非你被迫这样做)。

无论如何,您需要一种与您现在正在做的完全不同的方法。

于 2013-03-17T19:46:38.213 回答