Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “auto const*const”是否可以通过键入转换为某个单字类型?_C++_Constants_Auto - Fatal编程技术网

C++ “auto const*const”是否可以通过键入转换为某个单字类型?

C++ “auto const*const”是否可以通过键入转换为某个单字类型?,c++,constants,auto,C++,Constants,Auto,我想通过创建一个类似于 // (pseudocode) using deepcp=auto const*const; deepcp a=f(1),b=f(2),c=f(3); auto lam=[](deepcp x,deepcp y,deepcp z){ return *x+*y+*z; }; 我能用C++实现类似TIHS的东西吗?也许模板别名会有所帮助 #define deepcp auto const * const 我会照你的吩咐做 如果f是一个函数(而不是返回不同类型的宏),并且f

我想通过创建一个类似于

// (pseudocode)
using deepcp=auto const*const;
deepcp a=f(1),b=f(2),c=f(3);
auto lam=[](deepcp x,deepcp y,deepcp z){ return *x+*y+*z; };
我能用C++实现类似TIHS的东西吗?也许模板别名会有所帮助

#define deepcp auto const * const
我会照你的吩咐做


如果
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;
使用ret_f_t=decltype(f(1));
使用pointee\u t=std::pointer\u traits::element\u type;
使用deepcp std::add_const::type*const;
或者,作为一行含糊不清的话:

using deepcp = std::add_const<
  std::pointer_traits<decltype(f(1))>::element_type
>::type * const ;
使用deepcp=std::add_const<
标准::指针特征::元素类型
>::类型*常数;

注意:我使用了
add_const
,因为从您的示例中我不知道
f
是否返回指针或常量指针,也就是说,如果
pointee_t
是const,那么这两种可能性都适用


假设
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;
使用ret_f_t=decltype(f(1));
使用pointee\u t=std::pointer\u traits::element\u type;
使用deepcp std::add_const::type*const;
或者,作为一行含糊不清的话:

using deepcp = std::add_const<
  std::pointer_traits<decltype(f(1))>::element_type
>::type * const ;
使用deepcp=std::add_const<
标准::指针特征::元素类型
>::类型*常数;

注意:我使用了
add_const
,因为从您的示例中我不知道
f
是否返回指针或常量指针,也就是说,如果
pointee_t
是const,那么这两种可能性都适用



不会的
b
c
将被声明为
auto const
,而不是
auto const*const
,不是吗?是的。所以不要这样做-分别声明每个变量。我认为这是你能得到的最接近的。不要使用宏来定义类型或类型别名。这就是typedef和类型别名的用途,标准的库类型特征可以提供帮助。@MartinBonner单独声明每个变量总是一个好主意
auto
不是一种类型,它是一个关键字:虽然你可以定义新类型,但你不能定义新关键字,所以我也认为它是最接近它的。不,它不会
b
c
将被声明为
auto const
,而不是
auto const*const
,不是吗?是的。所以不要这样做-分别声明每个变量。我认为这是你能得到的最接近的。不要使用宏来定义类型或类型别名。这就是typedef和类型别名的用途,标准的库类型特征可以提供帮助。@MartinBonner单独声明每个变量总是一个好主意
auto
不是一种类型,它是一个关键字:虽然你可以定义新的类型,但你不能定义新的关键字,所以我也认为它是尽可能接近它。嗯,对于变量的初始化来说看起来不错,但对于OP示例中的另一行——generic lambda来说似乎不够一般。是的,我想我在作品中不够明确。lambda应该是真正通用的。也就是说,它应该接受被调用,例如
lam(getIntPtr()、getDoublePtr()、getMyCustomTypePtr())
。我想这要求太高了,因为
auto
对于泛型lambda和变量的含义完全不同。@Ruslan啊,我明白了。好吧,首先,你不需要在那里担任最高级别的警察。另外一个常数也不重要——除非你的问题比例子更复杂。所以只要使用
[](自动,自动,自动)
并取消引用任何出现的内容即可。它的好处是,如果您传递智能指针,它也会工作。是的,我通常只使用
auto
,但有时通用lambda可能会变得更复杂,一些常量正确性将有助于检测愚蠢的错误。@Ruslan好吧,对于通用lambda,您最初的问题的答案就是“不行”-无需更换
自动常数*
。因此,为了防止这些bug,我实际上使用了
auto-const*
。它可能更易于键入,但其好处是不会掩盖我们正在处理的是泛型lambda这一事实<代码>[](deepcp x、deepcp y、deepcp z)看起来绝对不是通用的。话虽如此,可能是因为有了概念,您可以编写类似于
[](ConstPtr,ConstPtr,ConstPtr)
的泛型lambda,其中
ConstPtr
是一个概念。嗯,对于变量初始化来说很好,但对于OP示例中的另一行-泛型lambda来说似乎不够通用。是的,我想我在作品中不够明确。lambda应该是真正通用的。也就是说,它应该接受被调用,例如
lam(getIntPtr()、getDoublePtr()、getMyCustomTypePtr())
。我想这要求太高了,因为
auto
对于泛型lambda和变量的含义完全不同。@Ruslan啊,我明白了。好吧,首先,你不需要在那里担任最高级别的警察。另外一个常数也不重要——除非你的问题比例子更复杂。所以只要使用
[](自动,自动,自动)
并取消引用任何出现的内容即可。它的好处是,如果您传递智能指针,它也会工作。是的,我通常只使用
auto
,但有时通用lambda可能会变得更复杂,一些常量正确性将有助于检测愚蠢的错误。@Ruslan好吧,对于通用lambda,您最初的问题的答案就是“不行”-无需更换
自动常数*
。因此,为了防止这些bug,我实际上使用了
auto-const*
。它可能更易于键入,但其好处是不会掩盖我们正在处理的是泛型lambda这一事实<代码>[](deepcp x、deepcp y、deepcp z)看起来绝对不是通用的。话虽如此,可能是因为有了概念,您可以编写类似于
[]的通用lambda