使用成员声明和enable_if?

gra*_*olf 5 c++ visual-c++ c++11 visual-studio-2012 visual-c++-2012

我需要使用成员声明的条件.

template <bool> struct B;
template <> struct B<true> { void foo(); };
template <> struct B<false> { };

template <typename T>
struct A : public B<is_default_constructible<T>::value> {
    using B<is_default_constructible<T>::value>::foo();

    void foo(int) {}
};
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为B<bool>::foo在一半的情况下没有定义.我怎样才能做到这一点?要在foo(int)旁边B<>::foo() 显示可见A<T>范围?

感谢帮助

Moh*_*awi 0

这是我的解决方案。我确信它不会是最好的,但它可以完成工作。

struct A {
    void foo(int) {}
};
Run Code Online (Sandbox Code Playgroud)

struct A应该包含您想要在这两种情况下定义的方法。

template <bool> struct B;
template <> struct B<false> : A {};
template <> struct B<true> : A { 
    using A::foo;
    void foo() {} 

};
Run Code Online (Sandbox Code Playgroud)

在 的情况下B<false>,仅void foo(int)被定义。在 的情况下B<true>void foo(int)void foo()均被定义。

template <typename T>
struct C : public B<is_default_constructible<T>::value> {};
Run Code Online (Sandbox Code Playgroud)

现在我不必担心B<is_default_constructible<T>::value>::foo()在某些情况下不会被定义。

class D { D() = delete; };

int main()
{
    C<int> c1;
    c1.foo(1234);
    c1.foo();
    // both methods are defined for C<int>

    C<D> c2;
    c2.foo(1234);
    // c2.foo(); // undefined method

    return 0;
}
Run Code Online (Sandbox Code Playgroud)