模板元编程NamedPipe客户端服务器

时间:2012-09-03 17:39:21

标签: c++ c++11 typetraits

我正在为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

我一直在使用C ++ 11中的type_traits,但实际上只是进入了它们 - 我真的很喜欢使用它们,但这确实在弯曲学习曲线。是否有人有足够的知识指出我正确的方向?

*第一个例子是刻意粗暴的,因为我一直在用模板的东西绕圈子 - 我真的需要被放在正确的道路上!

1 个答案:

答案 0 :(得分: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
}

这不仅会产生编译错误,而且会产生很好的描述性错误。