1

C ++ 11用のNamedPipe抽出を作成しており、次のAPI*が必要です。

template<typename Mode>
class NamedPipe final {
    public:
        void Open();

        std::enable_if<Mode == Receiver>
        void Send();

        std::enable_if<Mode == Receiver>
        void Receive();

        void Close();
}

その使用法は次のようになります。

NamedPipe<Sender> pipe_sender("test");
NamedPipe<Reciever> pipe_receiver("test");
pipe_sender.Open();
pipe_receiver.Open();
pipe_sender.Send("Some data");
pipe_receiver.Receive();
pipe_sender.Receive(); <--- compilation error

私はtype_traitsC++11で使用してきましたが、実際にそれらを使用したばかりです-私はそれらを使用することを本当に楽しんでいますが、これは本当に学習曲線を曲げています。私を正しい方向に向けるのに十分な知識を持っている人はいますか?

*最初の例は、テンプレートのものを使って円を描いて回っているので、意図的にラフです-私は本当に正しい道に進む必要があります!

4

1 に答える 1

4

静的アサーションを使用すると、コンパイルエラーを簡単に強制できます。

template<typename Mode>
class NamedPipe final {
    public:
        void Open();    
        void Send();    
        void Receive();    
        void Close();
}        
template<typename Mode>
void NamedPipe<Mode>::Send() {
    static_assert(std::is_same<Mode, Sender>::value, "Cannot send from receivers");
    // blah blah implementation
}        
template<typename Mode>
void NamedPipe<Mode>::Receive() {
    static_assert(std::is_same<Mode, Receiver>::value, "Cannot receive with senders");
    // blah blah implementation
}

これにより、コンパイルエラーが発生するだけでなく、説明的なエラーも発生します。

于 2012-09-03T17:46:13.050 に答える