c++ - 有什么方法可以创建用户定义的类型修饰符?
问题描述
我正在尝试实现一个lazy-c++ 来做到这一点,我已经得到Lazy<T>
了一个简单的类型别名std::function<T(void)>
。现在我可以编写的代码如下所示:
Lazy<int> first(Lazy<int> a, Lazy<int> b)
{
return [a] { return a(); };
}
并添加以下宏:
#define lazy(T, name, ...) Lazy<T> name (__VA_ARGS__)
#define lazy_return(lazy_value) return [lazy_value] { return lazy_value(); }
首先看起来像这样:
lazy(int, first, Lazy<int> a, Lazy<int> b)
{
lazy_return(a);
}
我想要的代码是:
lazy int first(lazy int a, lazy int b)
{
return a; // <- auto-deduced lazy_return because first was marked as lazy
}
有什么方法(最好没有外部库)可以让我随心所欲地编写代码吗?
解决方案
有什么方法(最好没有外部库)可以让我随心所欲地编写代码吗?
不,C++ 根本没有那种级别的语法灵活性。而且您也不能使用宏系统来获取它们。
但是,我认为这里有一个更深层次的问题。您想要的语言有一些非常简单的歧义。考虑一下lazy int * a
这是指向惰性 int 的指针,还是指向 int 的惰性指针?
C++ 模板遵循允许我们避免这些歧义的语法;这两种情况的区别很简单,很Lazy<int*> a
明显Lazy<int> *a
。
推荐阅读
- reactjs - 在 ReactJS 中将 CSS 类添加到 JSX
- firebase - 如何在 Firestore REST API runQuery 中对复合过滤器使用“或”操作
- html - 双击时更改文本颜色
- protobuf-net - 如何忽略作为父类成员的属性?
- azure - Azure 通过 ip 范围限制对 Web 应用程序的访问
- javascript - 如何更改 .aws 凭据路径?nodejs (aws-sdk)
- wordpress - 有没有办法使用 wp_enqueue_script 直接添加 JavaScript?
- c# - 为什么 Dictionary 对象中没有 Update() 函数?
- node.js - 与脚本所需的内存相比,为什么 nodejs 在 OS 中占用更多的虚拟内存?
- angular - 我如何构建 Angular 项目来保存所有文件,除了子目录中的 index.html