ゆとりーなの日記

日記的な事を書いて行くと思はれる

template小ネタ

boost::signals2が便利すぎることは有名ですが、クラスメンバとして持つ場合、接続とかは外部に公開したいけど、呼び出し自体は公開したくないという場合が多かったりすると思います。そこでこんなテンプレートを考えてみました。

template <typename Func, typename Parent>
class PrivateCallSignals : private boost::signals2::signal<Func, Parent> {
    friend class Parent;
public:
    using boost::signals2::signal<Func>::connect;
};

普通にコンパイル通りませんでした。typenameはクラスじゃないと怒られました。私の予想では、intとかをParentに渡した時に始めてエラーになるのかと思ってたんですが、どうやら違ったようです。
まあ接続だけをpublicにしたいなら、signals2自体はprivateに置き、素直に接続用のpublicメソッドを用意するのが残当なようです。

class Hoge {
public:
    boost::signals2::connection connectSlot(const boost::signals2::signal<void()>::slot_type &slot);
private:
    boost::signals2::signal<void()> signal_;
};