if both of its arguments are actually references to the same object

#include <iostream>

template <bool B, class T = void>
struct enable_if_c {
    typedef T type;
};

template <class T>
struct enable_if_c<false, T> {};

template <class Cond, class T = void>
struct enable_if : public enable_if_c<Cond::value, T> {};

template <bool B, class T = void>
struct disable_if_c {
    typedef T type;
};

template <class T>
struct disable_if_c<true, T> {};

template <class Cond, class T = void>
struct disable_if : public disable_if_c<Cond::value, T> {};

template < typename T, typename U >
typename disable_if_c<is_convertible<T*, U*>::value || is_convertible<U*,T*>::value, bool>::type
is_same_object (
        const T& a,
        const U& b
)
{
    return ((void*)&a == (void*)&b);
}

template < typename T, typename U >
typename enable_if_c<is_convertible<T*, U*>::value || is_convertible<U*,T*>::value, bool>::type
is_same_object (
        const T& a,
        const U& b
)
{
    return (&a == &b);
}

template <typename T> struct is_built_in_scalar_type        { const static bool value = false; };
template <> struct is_built_in_scalar_type<float>           { const static bool value = true; };
template <> struct is_built_in_scalar_type<double>          { const static bool value = true; };
template <> struct is_built_in_scalar_type<long double>     { const static bool value = true; };
template <> struct is_built_in_scalar_type<short>           { const static bool value = true; };
template <> struct is_built_in_scalar_type<int>             { const static bool value = true; };

template <typename T> inline typename disable_if<is_built_in_scalar_type<T>,void>::type assign_zero_if_built_in_scalar_type (T&){}
template <typename T> inline typename enable_if<is_built_in_scalar_type<T>,void>::type assign_zero_if_built_in_scalar_type (T& a){a=0;}

int main()
{
    int i = 1;
    std::cout << is_same_object<int, int>(i,i) <<std::endl; //true
    std::cout << is_same_object<long, int>(1,2) <<std::endl; //false
    std::cout << is_same_object<int, int>(1,1) <<std::endl; //false

    int i=1;
    assign_zero_if_built_in_scalar_type<int>(i);
    std::cout << i <<std::endl; //0
    char c = '1';
    assign_zero_if_built_in_scalar_type<char>(c);
    std::cout << c <<std::endl;  //1
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值