2016-01-11 88 views

回答

3

假設f是一個函數(而不是一些宏返回不同的類型),以及f返回一些原始指針類型,可以使用decltype:

using ret_f_t = decltype(f(1)); 
using pointee_t = std::pointer_traits<ret_f_t>::element_type; 
using deepcp std::add_const<pointee_t>::type * const; 

或者,作爲一行的mumbo jumbo:

using deepcp = std::add_const< 
    std::pointer_traits<decltype(f(1))>::element_type 
>::type * const ; 

Yay。

注:我用add_const因爲我不從你的榜樣知道f是否返回一個指針或常量指針,即如果pointee_t爲const或不 - 這種方式適用於這兩種可能性。

[Example]

+0

嗯,變量的初始化看起來不錯,但對於OP示例中的其他行(通用lambda)來說似乎不夠普遍。 – Ruslan

+0

好的,我想我在OP中不夠明確。 lambda本意是_really_通用的。即它應該接受被稱爲像例如'林(getIntPtr(),getDoublePtr(),getMyCustomTypePtr())'。我想這是要求太多,因爲'auto'對泛型lambdas的意義完全不同於變量。 – Ruslan

+0

@Ruslan啊我明白了。那麼,對於初學者來說,你不需要那裏的頂級常量。另一個常量也不重要 - 除非你的問題比例子更復雜。所以只需使用'[](auto,auto,auto)'並且引用它。如果你傳遞智能指針,它也會有效。 –

0
#define deepcp auto const * const 

會聽從你的命令

+0

不,它不會。 'b'和'c'會被聲明爲'auto const',而不是'auto const * const',不是嗎? – Ruslan

+1

是的。所以不要這麼做 - 分別聲明每個變量。 –

+1

我認爲這是儘可能接近你可以得到。 –

相關問題