首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为OpenSplice模板创建容器?

为OpenSplice模板创建容器?
EN

Stack Overflow用户
提问于 2020-04-03 00:08:55
回答 1查看 62关注 0票数 0

我正在尝试用OpenSplice构建一个C++程序,它允许用户指定应该加载的类型。通过使用OpenSplice的IDL预处理器(IDLPP)生成的C++文件不共享公共接口或基类,而是选择生成所有/大部分代码(我假设减少了不必要的依赖),这有点复杂。

我为这个问题创建的解决方案是首先生成一个带有python脚本的头文件,然后可以由主程序调用。这将允许生成所有的include语句,并将IDLPP创建的类型添加为定义。这样做的问题是稍后会引用这些定义。我想通过将定义的对象存储在容器中,然后简单地通过数字引用它们来解决这个问题。

这里的问题是,由于它们不共享公共基类,C++没有提供一种简单的方法将它们存储在同一个容器中。作为参考,OpenSplice对象通常是这样创建的(类似于STL中的元组或向量):

dds::topic::Topic<moduleName::classType> variableName(params);

我想将这些不同的对象类型存储在一个容器中。重复和“丑陋”的代码在这里并不是什么大问题,因为我无论如何都会生成这些文件。这是我目前尝试的实现:

代码语言:javascript
复制
#include <tuple>

template<class T, class U>
class TopicHolder{
public:
    std::tuple<dds::topic::Topic<T>, dds::topic::Topic<U>> tuple_;

    //empty constructor (error: no matching function for call to 'std::tuple<dds::topic::Topic<chat::NameServiceType, dds::topic::detail::Topic>,
    //  dds::topic::Topic<chat::ChatMessageType, dds::topic::detail::Topic>>::tuple()')
    TopicHolder(){}

    //or leave out the default constructor altogether (error: use of deleted function + note: implicity deleted because the default definition would be ill formed)
    //also previous error   

    //put the template in the constructor? (see main below for issues)
    TopicHolder(T, U){
        dds::domain::DomainParticipant dp(0);
        dds::topic::Topic<T> top1(dp, "top1");
        dds::topic::Topic<U> top2(dp, "top2");
        tuple_ = std::make_tuple(top1, top2);
    }

    void storeTopics(std::tuple<dds::topic::Topic<T>, dds::topic::Topic<U>> topics){
        tuple_ = topics;
    }
};

int main(){
    //call templated constructor?
    TopicHolder<chat::NameServiceType, chat::ChatMessageType> topicHolder();
    //all good, now try to pull tuple out...
    auto outTopic = std::get<0>(topicHolder.tuple_);
    //error: request for member 'tuple_' in 'topicHolder', which is of non-class type 'TopicHolder<chat::NameServiceType, chat::ChatMessageType>()'
    //leave out brackets in TopicHolder constructor: error: no matching function for call to 'TopicHolder<chat::NameServiceType, chat::ChatMessageType>::Topic()'

    return 0
}

正如您从注释中看到的,根据我试图修改的部分,这会产生各种不同的错误。看起来最接近的方法是使用TopicHolder(T, U)构造函数,但是当我尝试实际读取元组时,这种方法失败了

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-03 00:21:20

您遇到了令人头疼的解析问题

代码语言:javascript
复制
// Function declaration
TopicHolder<chat::NameServiceType, chat::ChatMessageType> topicHolder();

使用TopicHolder<chat::NameServiceType, chat::ChatMessageType> topicHolder;TopicHolder<chat::NameServiceType, chat::ChatMessageType> topicHolder{};

然后,你的成员似乎不是默认可构造的,所以你必须使用初始化器列表(这无论如何都是好的)。

您可能会这样做:

代码语言:javascript
复制
template<class T, class U>
class TopicHolder{
public:
    dds::domain::DomainParticipant dp_{0};
    std::tuple<dds::topic::Topic<T>, dds::topic::Topic<U>> tuple_;

    TopicHolder() : tuple_{dds::topic::Topic<T>(dp, "top1"), dds::topic::Topic<U>(dp, "top2")} {
    }

    void storeTopics(std::tuple<dds::topic::Topic<T>, dds::topic::Topic<U>> topics){
        tuple_ = topics;
    }
};

int main(){
    TopicHolder<chat::NameServiceType, chat::ChatMessageType> topicHolder;

    auto& outTopic = std::get<0>(topicHolder.tuple_);
    // ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60996050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档