2

通常、次のboost::signals2::signalように定義します。

typedef boost::signals2::signal<void (int)> MySignalType;
MySignalType mySignal;

次に、を使用MySignalType::slot_function_typeして、その信号と互換性のある関数シグネチャを取得できます。

しかし、私は反対のことをしようとしています。

Boostシグナルを使用しない既存のコードがあります。代わりに、コードはaを渡し、boost::functionそれを呼び出してイベントを「通知」します。既存ので作成boost::signals2::signal たいboost::function。私は最も直感的な組み合わせを試しました:

typedef boost::function<void (int)> MyFunctionType;
typedef boost::signals2::signal<MyFunctionType> MySignalType;

しかし、これはコンパイラによって拒否されます。どちらもBoostパッケージであるため、これが不可能な場合は驚かれることでしょう。私の推測では、boost::functionオブジェクト(またはtypedef)には、純粋関数のシグネチャが必要な場合に使用できる目的と同様の独自の内部typedefがありますが、 boost::functionのドキュメントslot_function_typeにはこのようなものは見つかりませんでした。

同様のQ&Aを検索し、Boostのドキュメントをざっと読んでみましたが、同じことをしている人は見つかりませんでした。

既存のブースト機能の観点からブースト信号を定義する方法はありますか?

ありがとう。

4

1 に答える 1

5

boost :: functionから署名を抽出したい場合は、次のように試すことができます。

#include <boost/signals2.hpp>
#include <boost/function.hpp>
#include <iostream>
#include <ostream>

using namespace boost;
using namespace std;

template<typename T>
struct get_arg;

template<template<typename> class Func,typename Sig>
struct get_arg< Func<Sig> >
{
    typedef Sig type;
};

int main()
{
    typedef boost::function<void()> F;
    signals2::signal< get_arg<F>::type > signal;
}

編集:

とても興味深い。あなたのコードが何をしているのか、そしてどのようにそれを思いついたのかを説明している場所を教えていただけますか?

get_argはクラステンプレートであり、その引数から(get_argのテンプレート引数から)テンプレート引数を抽出します。

言い換えれば、それはメタ関数です-それは文字通り型を操作する関数です(通常の関数は値を操作します)。

template<template<typename> class Func,typename Sig>
struct get_arg< Func<Sig> >

この構文は、get_argクラステンプレートの部分的な特殊化です。

template<typename> class Func

この構文はテンプレートテンプレートパラメータです。

typedef Sig type;

慣例により、Metafunctionの結果はネストされた「type」メンバーになります。

使用法は次のとおりです。

get_arg< SomeClassTemplate<SomeType> >::type

その結果、SomeTypeになります

詳細については、次の書籍をご覧ください。

  1. 最新のC++デザイン:ジェネリックプログラミングとデザインパターンの適用。アンドレイ・アレキサンドレスク
  2. C ++テンプレートメタプログラミング:Boost and Beyondの概念、ツール、およびテクニック。デービッド・アブラハムスとアレクセイ・グルトボイ
于 2012-11-08T23:57:26.403 に答える