2016-04-19 51 views
3

我剛剛在std::add_pointer的C++ 11中發現了存在。 我看了一眼在以下鏈接的文檔,但我真的不明白這樣一個對象的目的:std :: add_pointer vs經典指針

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

  • 之間有什麼主要區別例如std::add_pointer<int>和經典的指針即int*
  • 你如何評價這樣一個指針? (你使用::value?)
  • 什麼是增加的代表?
+0

您可能感興趣的這[我的問題](http://stackoverflow.com/questions/16435170/use-cases-for-stdadd-const-and-similar)。 – Angew

+0

這在元編程中很有用,即編寫不知道確切類型的函數模板時。 –

+0

@ el.pescado你能讓我成爲一個小例子嗎? – Stefano

回答

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>>; 

這需要一個元函數Z和測試Test和類型T,並返回Z<T>如果Test<T>爲真,否則返回T

您無法通過just put a * after the typeapply_if_t作爲Z。您可以通過std::add_pointeradd_pointer_t

假設您只想添加指針,只要某些東西是函數類型(如int(int))。那麼如果X是功能類型,則apply_if_t< std::add_pointer_t, std::is_function, X >將是,如果不是,則X

std::add_pointer<T>::type是到T*作爲int inc(int x){return x+1;}是到x+1

+0

'add_pointer'也可以很好地引用和(因爲LWG問題)瘋狂的函數類型。前者在轉發引用方面相當方便。 –