2016-01-11 56 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

我认为这是尽可能接近你可以得到。 –

相关问题