lambda 的仅类型模板参数

2024-01-24

想象一下我有这个结构:

struct Foo {
    operator int() {
        return 11;
    }
    operator unsigned int() {
        return 22;
    }
} foo;

当此结构体转换为 int 时,它返回 11,但当转换为 unsigned int 时,它返回 22。

使用普通函数,我可以使用模板和 getter 函数来选择:

template<typename T>
T get() {
    return (T)foo;
}

现在,当像这样调用这个函数时get<int>()它会返回11,但是当这样称呼它时get<unsigned int>()它会返回22.

直到现在,当我尝试使用 lambda 时,一切都很好:

auto lambda=[](auto type) {
    return (decltype(type))foo;
};

现在当调用 lambda 时lambda(0)它返回11,并将其称为lambda(0U)回报22.

这可以正常工作,尽管相当“hacky”,但是需要使用该类型的实例,这对于较大的类型来说并不理想。 因此出现了另一种方法,甚至是“更黑客”的方法来实现这一目标:

auto lambda=[](auto* typePointer) {
    return (decltype(*typePointer))foo;
};

现在称其为lambda((int*)NULL)回报11但称其为lambda((unsigned int*)NULL)回报22。 正如您可能已经注意到的那样,这是相当冗长和“hacky”的,所以我尝试了一种更简单和传统的方法:

auto lambda=[]<typename T>() {
    return (T)foo;
};

起初我以为它不会编译,因为我在任何地方都没有看到这个语法,但它确实可以编译(至少使用 GCC)。但是,当尝试调用它时,会出现错误:

lambda();


testlambda.cpp: In function ‘int main()’:
testlambda.cpp:25:9: error: no match for call to ‘(main()::<lambda()>) ()’
  lambda();
         ^
testlambda.cpp:22:29: note: candidate: template<class T> main()::<lambda()>
  auto lambda=[]<typename T>() {
                             ^
testlambda.cpp:22:29: note:   template argument deduction/substitution failed:
testlambda.cpp:25:9: note:   couldn't deduce template parameter ‘T’
  lambda();
         ^

如您所见,候选人是template<class T> main()::<lambda()>,但这也不能编译:

lambda<int>() -> error: expected primary-expression before ‘int’

所以,我的问题是:官方的、符合标准的方法是什么(如果有的话)?我真的希望指针破解不是唯一的方法。在实际代码中使用似乎很笨拙。

我使用 G++ (GCC 5.4.0) 作为我的编译器。我也在使用 C++14 标准,例如-std=c++14.


您可以传递空标签类型的变量模板:

template <class T> struct tag_t { using type = T; };
template <class T>
constexpr tag_t<T> tag{};

你可以这样写你的 lambda:

auto lambda = [](auto type) {
    return static_cast<typename decltype(type)::type>(foo);
};

or

auto lambda = [](auto type) -> typename decltype(type)::type {
    return foo;
};

并这样称呼它:

lambda(tag<int> ); // 11
lambda(tag<unsigned> ); // 22
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lambda 的仅类型模板参数 的相关文章

随机推荐

  • 了解 Objective-C 中强指针和弱指针的实际应用

    我刚刚阅读了已接受的优秀答案this https stackoverflow com questions 9262535 explanation of strong and weak storage in ios5这个问题澄清了 Objec
  • JavaScript 输入数字

    如何使用 window prompt 从用户处获取 2 个数字并将它们相加而不连接 我的想法是 var temp window prompt Number1 var temp2 window prompt Number2 var answe
  • 初始化列表和运算符的 RHS

    我不明白为什么初始化列表不能在运算符的 RHS 上使用 考虑 class foo struct bar template
  • javafx拉伸图像以填充按钮?

    我正在用 Java JavaFX 编写一个 星际迷航 游戏 我的想法是主游戏屏幕是一个 10x10 的按钮网格面板 所有游戏部件 企业 克林贡 行星等 都将在按钮中显示为图标 这样 您可以单击一个空间对象来选择它 扭曲到它 射击它等等 当然
  • HttpWebRequest 与 HttpClient

    我有一段代码可以使用HttpWeb请求 and HttpWeb响应但我想将其转换为使用Http客户端 and Http响应消息 这是有效的代码块 HttpWebRequest request HttpWebRequest HttpWebRe
  • 为 OS X 构建虚拟相机

    我需要在 Skype 等程序中获取合成生成的视频流 音频部分很简单 有一个项目叫音花 https code google com p soundflower 这是一个适配器 它在一侧呈现虚拟音频目标设备 在另一侧呈现视频源 我正在为 OSX
  • 使用 Qt 显示 ubuntu (linux) 通知

    我正在使用 Qt 中的 Phonon 多媒体框架 它会弹出一条消息 就像改变音量时弹出的音量通知消息 因为我的音频设备尚未完全配置 是否可以从 Qt 启动我自己的通知 请看上图 非常感谢 AFAIK 使用 libnotify 是可行的方法
  • 如何获取最接近的元素id属性

    我试图找到最接近的具有 id 属性的元素并获取id 该元素可以是 p p div 或其他元素 我努力了 element test closest div id attr id 但只有当元素是 a 时它才会获取 iddiv 我想变得更加普遍
  • 为什么不读/写其内容的结构体的方法仍然会导致竞争情况?

    From 戴夫 切尼博客 http dave cheney net 2015 11 18 wednesday pop quiz spot the race 以下代码显然会导致竞争情况 只需更改即可解决func RPC version int
  • NTP 对于分布式时间同步有多好?

    NTP 用于保持一组服务器时间同步的准确度如何 我正在编写一项服务 需要一组服务器 一些充当客户端 一些充当服务器 同步到二级粒度 我想知道 NTP 是否是最好使用的东西 或者是否有更好的东西 我应该在其中一个上运行 ntp 服务器 并让其
  • 如何从多个接口组成一个 WCF 合约?

    我有多个接口 所有这些都应该由单个合约接口继承和公开 interface A void X interface B void Y interface C A B this is the public contract 这怎么可能 我无法将
  • 如何将 Visual Studio .NET 2008 解决方案转换为 Visual Studio .NET 2005?

    假设解决方案仅包含类 并且这些类全部按照 NET 2 0 规范编写 如果要在 Visual Studio 2008 中打开 转换和保存该解决方案 是否可以稍后在 Visual Studio 2005 中重新打开该解决方案 并对 SLN 文件
  • 根据多年每日天气数据计算每日平均值?

    我有从 1984 年到 2014 年 31 年的每日数据 我想计算变量的 31 年的每日平均值 date Min daily Max daily Rain daily 01 01 1984 18 8 3 6 0 02 01 1984 20
  • 将 DataGridView 内容复制到剪贴板

    我想复制 DataGridView 的内容并将其粘贴到 Excel 中 我试过 myDataGrid SelectAll DataObject dataObj myDataGrid GetClipboardContent Clipboard
  • android中如何保存数据结构?

    我想存储这样的结构中的一些数据 class Project ChildA a ChildB b class ChildA ChildC c 我创建了如下数据 Projet x new Project x a new ChildA x a c
  • Tensorflow 2.0 数据集和数据加载器

    我是一个pytorch用户 我习惯了pytorch中的data dataset和data dataloader api 我正在尝试使用tensorflow 2 0构建相同的模型 我想知道pytorch中是否有与这些api类似的api 如果没
  • 如何检查网络端口是否开放?

    我如何使用 python 知道 linux ubuntu 而不是远程系统 上的某个端口是否打开 关闭 如何在 python 中列出这些开放端口 网络统计 有没有办法将 netstat 输出与 python 集成 您可以使用插座模块 http
  • 使 Google 可视化 - 注释图表在 GWT 中工作

    我正在使用新发布的注释图表 https developers google com chart interactive docs gallery annotationchart在 gwt 中通过调用本机 javascript 到目前为止我得
  • 在 RecyclerView 上快速点击(点击)会打开多个 Fragments

    我已经为 RecyclerView 的 ViewHolder 实现了 onClick 侦听器 但是 当我执行非常快速的双击或鼠标单击时 它会执行该任务 在本例中打开一个单独的片段 两次或三次 这是我的代码 public class View
  • lambda 的仅类型模板参数

    想象一下我有这个结构 struct Foo operator int return 11 operator unsigned int return 22 foo 当此结构体转换为 int 时 它返回 11 但当转换为 unsigned in