2016-04-19 5 views
3

Ich entdeckte gerade die Existenz in C++ 11 von std::add_pointer. Ich hatte einen Blick in die Dokumentation unter dem folgenden Link, aber ich wirklich nicht bekommen, den Zweck eines solchen Objekts:std :: add_pointer vs klassischen Zeiger

http://www.cplusplus.com/reference/type_traits/add_pointer/

  • Was der Hauptunterschied ist zwischen etwa std::add_pointer<int> und einem klassischen Zeiger dh int*?
  • Wie respektieren Sie solch einen Zeiger? (verwenden Sie ::value?)
  • für was steht?
+0

Das könnte Sie interessieren [Frage von mir] (http://stackoverflow.com/questions/16435170/use-cases-for-stdadd-const-and-similar). – Angew

+0

Das ist nützlich bei der Metaprogrammierung, d. H. Beim Schreiben von Funktionsschablonen, die keine genauen Typen kennen. –

+0

@ el.pescado kannst du mir ein kleines beispiel machen? – Stefano

Antwort

3
template<class T>struct tag_t{using type=T;}; 
template<class Tag>using type=typename Tag::Type; 

template<template<class...>class Z, template<class...>class Test, class T> 
struct apply_if: 
    std::conditional_t< Test<T>{}, tag_t<Z<T>>, tag_t<T> > 
{}; 
template<template<class...>class Z, template<class...>class Test, class T> 
using apply_if_t = type<apply_if<Z,Test,T>>; 

dies nimmt eine metafunction Z und einen Test Test und einen Typ T und gibt Z<T> wenn die Test<T> wahr ist, und sonst gibt T.

Sie können just put a * after the type nicht an apply_if_t als Z übergeben. Sie können std::add_pointer oder add_pointer_t übergeben.

Angenommen, Sie möchten nur Zeiger hinzufügen, wenn es sich um einen Funktionstyp handelt (z. B. int(int)). Dann wird apply_if_t< std::add_pointer_t, std::is_function, X > sein, wenn X ein Funktionstyp ist, und X wenn nicht.

std::add_pointer<T>::type ist zu T* als int inc(int x){return x+1;} ist zu x+1.

+0

'add_pointer' spielt auch gut mit Referenzen und (seit einem LWG-Problem) verrückte Funktionstypen. Ersteres ist ziemlich praktisch mit Weiterleitungsreferenzen. –