小编nze*_*zer的帖子

使用std :: enable_if保护复制构造函数

我写了一个类来促进类型擦除,它有以下构造函数:

class Envelope {
public:
    Envelope() {}

    template<typename Runnable>
    Envelope(Runnable runnable)
        : m_runFunc(&Envelope::RunAndDeleteRunnable<Runnable>), m_runnable(new Runnable(runnable)) {
    }

    template<typename Runnable>
    Envelope(Runnable * runnable)
        : m_runFunc(&Envelope::RunRunnable<Runnable>), m_runnable(runnable) {
    }
};
Run Code Online (Sandbox Code Playgroud)

我想重写第一个非默认构造方法来参考,而不是一个值(Runnable & runnable不是Runnable runnable),但如果我这样做,那么用非const复制Envelope像这样

Envelope next(...);
Envelope otherNext(next);
Run Code Online (Sandbox Code Playgroud)

调用该构造函数而不是复制构造函数,我得到一个堆栈溢出.

我想我可以防止构造的时候被称为Runnable== Envelopestd::enable_if像这样

template<typename Runnable = typename std::enable_if<std::negate<std::is_same<Runnable, Nova::Envelope>>::value, Runnable>::type>
Envelope(Runnable & runnable)
    : m_runFunc(&Envelope::RunAndDeleteRunnable<Runnable>), m_runnable(new Runnable(runnable)) {
}
Run Code Online (Sandbox Code Playgroud)

它编译得很好(尽管它在Visual Studio 2015中触发了一些智能感知错误,这有点令人讨厌),但它并没有阻止该构造函数被非const调用Envelope并触发堆栈溢出.

我不完全确定我在这里做错了什么.

c++ templates type-traits template-meta-programming c++11

4
推荐指数
1
解决办法
346
查看次数