RTI Connext Modern C++ API  Version 6.1.0

The unmodified subscription example generated by rtiddsgen using the C++11 option for the -language flag.

See also
Subscription Example
* (c) Copyright, Real-Time Innovations, 2020. All rights reserved.
* RTI grants Licensee a license to use, modify, compile, and create derivative
* works of the software solely for use with RTI Connext DDS. Licensee may
* redistribute copies of the software provided that all such copies are subject
* to this license. The software is provided "as is", with no warranty of any
* type, including any warranty for fitness for any purpose. RTI is under no
* obligation to maintain or support the software. RTI shall not be liable for
* any incidental or consequential damages arising out of the use or inability
* to use the software.
#include <algorithm>
#include <iostream>
#include <dds/sub/ddssub.hpp>
#include <dds/core/ddscore.hpp>
#include <rti/config/Logger.hpp> // for logging
// alternatively, to include all the standard APIs:
// <dds/dds.hpp>
// or to include both the standard APIs and extensions:
// <rti/rti.hpp>
// For more information about the headers and namespaces, see:
// https://community.rti.com/static/documentation/connext-dds/6.1.0/doc/api/connext_dds/api_cpp2/group__DDSNamespaceModule.html
// For information on how to use extensions, see:
// https://community.rti.com/static/documentation/connext-dds/6.1.0/doc/api/connext_dds/api_cpp2/group__DDSCpp2Conventions.html
#include "Foo.hpp"
#include "application.hpp" // for command line parsing and ctrl-c
int process_data(dds::sub::DataReader<MyOtherType> reader)
// Take all samples
int count = 0;
for (const auto& sample : samples) {
if (sample.info().valid()) {
std::cout << sample.data() << std::endl;
} else {
std::cout << "Instance state changed to "
<< sample.info().state().instance_state() << std::endl;
return count;
} // The LoanedSamples destructor returns the loan
void run_subscriber_application(unsigned int domain_id, unsigned int sample_count)
// DDS objects behave like shared pointers or value types
// (see https://community.rti.com/best-practices/use-modern-c-types-correctly)
// Start communicating in a domain, usually one participant per application
// Create a Topic with a name and a datatype
dds::topic::Topic<MyOtherType> topic(participant, "Example MyOtherType");
// Create a Subscriber and DataReader with default Qos
dds::sub::Subscriber subscriber(participant);
dds::sub::DataReader<MyOtherType> reader(subscriber, topic);
// Create a ReadCondition for any data received on this reader and set a
// handler to process the data
unsigned int samples_read = 0;
[reader, &samples_read]() { samples_read += process_data(reader); });
// WaitSet will be woken when the attached condition is triggered
waitset += read_condition;
while (!application::shutdown_requested && samples_read < sample_count) {
std::cout << "MyOtherType subscriber sleeping up to 1 sec..." << std::endl;
// Run the handlers of the active conditions. Wait for up to 1 second.
int main(int argc, char *argv[])
using namespace application;
// Parse arguments and handle control-C
auto arguments = parse_arguments(argc, argv);
if (arguments.parse_result == ParseReturn::exit) {
} else if (arguments.parse_result == ParseReturn::failure) {
// Sets Connext verbosity to help debugging
try {
run_subscriber_application(arguments.domain_id, arguments.sample_count);
} catch (const std::exception& ex) {
// This will catch DDS exceptions
std::cerr << "Exception in run_subscriber_application(): " << ex.what()
<< std::endl;
// Releases the memory used by the participant factory. Optional at
// application exit