【问题标题】:c++17 how to write is_pointer_pointer generic lambda?c++17如何写is_pointer_pointer泛型lambda?
【发布时间】:2018-04-17 12:55:46
【问题描述】:
auto is_pointer_pointer = [] ( auto arg ) -> bool {
     // implementation here
}

一种方法如何实现这个通用 lambda?

用法示例:

int main ( int argc, char ** argv ) {
     auto dp = is_pointer_pointer(argv) ; // returns true
}

解决方案

感谢@luk32。他的解决方案(又名“答案”)我采用了魔杖盒,并使其更具弹性。代码是here

解决方案是这个 lambda:

  // return true if argument given is
  // pointer to pointer of it's type T
  // T ** arg
  auto is_pointer_pointer = [&] ( const auto & arg ) constexpr -> bool {
    using arg_type = std::decay_t< decltype(arg) > ;
     return std::is_pointer_v<arg_type> && 
       std::is_pointer_v< std::remove_pointer_t<arg_type> > ;
 };

对于知识的渴求here 是解释带有自动参数的 c++17 通用 lambda 问题的文章。提示:这就是我在上面使用 std::decay 的原因。

【问题讨论】:

  • 如果 arg 的类型为 double*,您的意思是返回 true?还是某种T**
  • 您可以将解决方案放在答案中,也许这样会更清楚一些。如果您有原始解决方案,通常会回答您自己的问题。
  • 我没有原始解决方案,我采用了@luk32 解决方案并使其更具弹性。您是否对他的解决方案(即“答案”)投了赞成票?

标签: c++ lambda c++17 generic-programming


【解决方案1】:

在 c++14 中使用 decltypetype_traits 设施已经成为可能。

#include <type_traits>
#include <iostream>
using namespace std;


int main() {
  auto is_double_pointer = [] ( auto arg ) -> bool {
    return std::is_same<decltype(arg), double*>::value;
  };

  auto is_pointer_pointer = [] ( auto arg ) -> bool {
    return std::is_pointer<decltype(arg)>::value && 
           std::is_pointer< typename std::remove_pointer<decltype(arg)>::type >::value;
  };


  double d, *ptrd, **ptrptrd;

  std::cout << is_double_pointer(d) << '\n';
  std::cout << is_double_pointer(ptrd) << '\n';
  std::cout << is_double_pointer(ptrptrd) << '\n';
  std::cout << is_pointer_pointer(d) << '\n';
  std::cout << is_pointer_pointer(ptrd) << '\n';
  std::cout << is_pointer_pointer(ptrptrd) << '\n';
  return 0;
}

输出:

0
1
0
0
0
1

编辑:也适用于char** argv;

【讨论】:

  • 谢谢。在这种情况下,“double”是指“指向指针的指针”,也就是“双指针”,而不是指向 double 类型的指针 .. 但您的解决方案可能适用于任何类型。可能。也许wandbox.org 可能会证明你是对的,如果你把你的代码粘贴到那里并使它适用于 T?再次感谢。
  • 有两个版本,两种解释都适用于它们应该做的事情。 IMO 再清楚不过了。获取代码,使用它,看看它是否有效。
  • 好的,谢谢@luk32,我玩过,效果很好,我让它变得有弹性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2017-05-28
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多