首页 > 解决方案 > 有什么方法可以创建用户定义的类型修饰符?

问题描述

我正在尝试实现一个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++

解决方案


有什么方法(最好没有外部库)可以让我随心所欲地编写代码吗?

不,C++ 根本没有那种级别的语法灵活性。而且您也不能使用宏系统来获取它们。

但是,我认为这里有一个更深层次的问题。您想要的语言有一些非常简单的歧义。考虑一下lazy int * a这是指向惰性 int 的指针,还是指向 int 的惰性指针?

C++ 模板遵循允许我们避免这些歧义的语法;这两种情况的区别很简单,很Lazy<int*> a明显Lazy<int> *a


推荐阅读