タグとメッセージで構成されるテンプレート・クラス。メッセージは定義型の 1 つにできる値です。
template<typename TagType, typename T0, typename T1...typename TN> class tagged_msg;
#include "tbb/flow_graph.h"
tagged_msg テンプレート・クラスは、型が実行時に決定されるメッセージ用です。T0, T1 ...TN 型のメッセージは、TagType 型でタグ付けされます。タグはメッセージを識別するのに使用できます。フローグラフでは、tagged_msg は indexer_node の出力として使用されます。
tagged_msg は実装にタプルを使用しているため、タプルで保持できる型の数の制限が tagged_msg にも適用されます。
#include<iostream> #include "tbb/flow_graph.h" typedef tbb::flow::tagged_msg<size_t, int, char, double> tagged_msg_type; void print_type_and_value(const tagged_msg_type &tm) { if (tm.tag()==1 && tm.is_a<int>()) std::cout << "Type is an int, value is : " << tm.cast_to<int>() << std::endl; else if (tm.tag()==2 && tbb::flow::is_a<char>(tm)) std::cout << "Type is a char, value is : " << tbb::flow::cast_to<char>(tm) << std::endl; else if (tm.tag()==3 && tm.is_a<double>()) std::cout << "Type is a double, value is : " << tm.cast_to<double>() << std::endl; else std::cout << "Invalid tag or type" << std::endl; } int main() { print_type_and_value(tagged_msg_type(1, 8)); print_type_and_value(tagged_msg_type(2, 'c')); print_type_and_value(tagged_msg_type(3, 23.78)); print_type_and_value(tagged_msg_type(4, 12)); return 0; }
この例で、関数 print_type_and_value は、int、char または double のいずれかの値を保持できるタグ型 size_t の tagged_msg を受け取り、格納されている型と値を出力します。異なるタグおよび値の型の tagged_msg オブジェクトが関数に渡され、タグを使用して値の識別と取得が行われます。値の取得には、tagged_msg::cast_to テンプレート・メソッドまたは tbb::flow::cast_to テンプレート関数のいずれかが使用されます。
例を実行すると、次の出力が生成されます。
Type is an int, value is : 8 Type is a char, value is : c Type is a double, value is : 23.78 Invalid tag or type
namespace tbb { namespace flow { template<typename TagType, typename T0, typename T1...typename TN> class tagged_msg { public: template<typename T, typename R> tagged_msg(T const &index, R const &val); TagType tag() const; template<typename V> const V& cast_to() const; template<typename V> bool is_a() const; }; // 次の関数はテンプレート・コンテキストの tagged_msg の使用を単純化します template<typename V, typename T> const V& cast_to(T const &t); template<typename V, typename T> bool is_a(T const &t); } }
メンバー | 説明 |
---|---|
template<typename T, typename R> tagged_msg(T const &index, R const &value) |
タグ index および値 val で tagged_msg を構築します。 |
TagType tag() const |
現在のタグを返します。 |
template<typename V> const V& cast_to() const |
tagged_msg に格納されている値を返します。値が V 型でない場合、std::runtime_error 例外がスローされます。 |
template<typename V> bool is_a() const |
V が tagged_msg で保持されている値の型の場合は true。その他の場合は false。 |