您的派任经营人的基本想法存在缺陷,因为即使添加了<条码>的类型<> /代码>,该代码为不可替代背景<>。 因此,模板参数将永远不会被推卸,除非你明确指明如下类型:<条码>B.operator=<有些——类型与“其他_B”。
An easier version would be to just make it a normal function template, and SFINAE your way out.
#include <type_traits>
template<class> struct is_a_B;
template<class B2>
typename std::enable_if<
is_a_B<B2>::value,
B&
>::type operator=(B2 const& other){
// ...
}
现在所有左边都是<代码>is_a_B。 海峡。 你们能够以可能的虚假积极态度,使这种情况很容易发生:
template<class B>
struct is_a_B{
typedef char yes;
typedef yes (&no)[2];
template<class T>
static yes test(typename T::I_am_a_B_type*);
template<class T>
static no test(...);
static bool const value = sizeof(test<B>(0)) == sizeof(yes);
};
Just provide the I_am_a_B_type
页: 1
http://ideone.com/MYMiH”rel=“nofollow> 关于Ideone的活例子。 评论b1 = 5;
行,并汇编成。
And now for the slightly more perverted complicated way with no false-positives. :)
template<bool Cond, class OnTrue>
struct and_v{
static bool const value = OnTrue::value;
};
template<class OnTrue>
struct and_v<false, OnTrue>{
static bool const value = false;
};
template<class B>
struct is_a_B{
typedef char yes;
typedef yes (&no)[2];
template<class T>
static yes has_parent(typename T::parent*);
template<class T>
static no has_parent(...);
template<class T>
static yes is_A(A<T>*);
static no is_A(...);
template<class T>
struct lazy_test{
typedef typename std::add_pointer<typename T::parent>::type p_type;
static bool const value = sizeof(is_A(p_type(0))) == sizeof(yes);
};
static bool const value = and_v<sizeof(has_parent<B>(0)) == sizeof(yes),
lazy_test<B>>::value;
};
For this one you need a typedef A<T> parent;
inside B
. It s staged in two parts:
- First I test if a
parent
typedef exists, and if it does
- If it s actually a typedef of the
A
class template.
可悲的是,逻辑操作者(&&
,>,?:
t t 如同我所希望的那样,在模板代码上不出现短路,因此,我不得不写上<代码>和_v
的模板+ a lazy tester,只要有即
类型def>,只有经过评估。
http://ideone.com/tyVTo”rel=“nofollow> 关于Ideone的活例子。 http://ideone.com/szZsc” rel=“nofollow”