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>范围?
感谢帮助
这是我的解决方案。我确信它不会是最好的,但它可以完成工作。
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)
| 归档时间: |
|
| 查看次数: |
429 次 |
| 最近记录: |