Wow, finally I've got it:
#include <atomic>
#include <type_traits>
template<typename T, bool isIntegral = std::is_integral<T>::value, bool
isNotPointer = !std::is_pointer<T>::value>
struct xatomic : public std::atomic<T>
{
xatomic() = default;
xatomic( xatomic const &xa );
using std::atomic<T>::operator =;
using std::atomic<T>::is_lock_free;
using std::atomic<T>::store;
using std::atomic<T>::load;
using std::atomic<T>::operator T;
using std::atomic<T>::exchange;
using std::atomic<T>::compare_exchange_weak;
using std::atomic<T>::compare_exchange_strong;
using std::atomic<T>::fetch_add;
using std::atomic<T>::fetch_sub;
using std::atomic<T>::operator ++;
using std::atomic<T>::operator --;
using std::atomic<T>::operator +=;
using std::atomic<T>::operator -=;
using std::atomic<T>::fetch_and;
using std::atomic<T>::fetch_or;
using std::atomic<T>::fetch_xor;
using std::atomic<T>::operator &=;
using std::atomic<T>::operator |=;
using std::atomic<T>::operator ^=;
};
template<typename T, bool isIntegral, bool isNotPointer>
inline
xatomic<T, isIntegral, isNotPointer>::xatomic( xatomic const &xa )
{
*this = (T)xa;
}
template<typename T>
struct xatomic<T, false, true> : public std::atomic<T>
{
xatomic() = default;
xatomic( xatomic const &xa );
using std::atomic<T>::operator =;
using std::atomic<T>::is_lock_free;
using std::atomic<T>::store;
using std::atomic<T>::load;
using std::atomic<T>::operator T;
using std::atomic<T>::exchange;
using std::atomic<T>::compare_exchange_weak;
using std::atomic<T>::compare_exchange_strong;
};
template<typename T>
inline
xatomic<T, false, true>::xatomic( xatomic const &xa )
{
*this = (T)xa;
}
template<typename T>
struct xatomic<T *, false, false> : public std::atomic<T>
{
xatomic() = default;
xatomic( xatomic const &xa );
using std::atomic<T>::operator =;
using std::atomic<T>::is_lock_free;
using std::atomic<T>::store;
using std::atomic<T>::load;
using std::atomic<T>::operator T;
using std::atomic<T>::exchange;
using std::atomic<T>::compare_exchange_weak;
using std::atomic<T>::compare_exchange_strong;
using std::atomic<T>::operator ++;
using std::atomic<T>::operator --;
using std::atomic<T>::operator +=;
using std::atomic<T>::operator -=;
};
template<typename T>
inline
xatomic<T *, false, false>::xatomic( xatomic const &xa )
{
*this = (T)xa;
}
struct S
{
};
xatomic<S> xas;
xatomic<int> xai;
xatomic<int *> xap;
Don't know why I had to invert is_pointer<T>::value to isNotPointer.