Listing 8
#include <type_traits> #include <iostream> using std::tr1::has_trivial_assign; using std::tr1::false_type; using std::tr1::true_type; using std::cout; template <class Ty> Ty *do_copy(const Ty *first, const Ty *last, Ty *dest, const true_type&) { // copy with memcpy cout << "using memcpy\n"; unsigned n = last - first; memcpy(dest, first, n * sizeof(Ty)); return dest + n; } template <class Ty> Ty *do_copy(const Ty *first, const Ty *last, Ty *dest, const false_type&) { // copy element by element cout << "using element copy\n"; while (first != last) *dest++ = *first++; return dest; } template <class Ty> Ty *copy(const Ty *first, const Ty *last, Ty *dest) { // dispatch based on trivial assignment return do_copy(first, last, dest, has_trivial_assign<Ty>()); } struct S { // struct without trivial assignment S& operator=(const S& right) { return *this; } }; int main() { // demonstrate use of has_trivial_assign int int_data[20]; int int_copy[20]; copy(int_data, int_data + 20, int_copy); S s_data[20]; S s_copy[20]; copy(s_data, s_data + 20, s_copy); return 0; }