如何在用户定义的文字中捕获上下文?

时间:2014-03-22 18:49:01

标签: c++ c++11

如果我能将lambda用作用户定义的文字,我会喜欢它,因为那时我可以做类似的事情:

struct Context
{
    // Maintains important context information
};

struct Foo
{
    Foo(Context& context, int value); // Foo needs a context to operate on
};

struct Factory
{
    Context& context;
    Factory(Context& context) : context(context) {}

    Foo operator() (int value) const
    {
        return Foo(context, value);
    }
}

int main()
{
    Context context;
    Factory factory(context);

    // I'd like to do something like this, but obviously it doesn't work
    using
    Foo operator"" _f = [&factory](int value) { return factory(value); };

    Foo x = 123_f;

    // But since that doesn't work, I have to do this:
    Foo x = factory(123);
}

基本上,我有一些依赖于特定上下文的对象(垃圾收集器)。为了创建这些对象,我必须将上下文传递给对象的构造函数,或者我必须创建一个工厂(在内部存储上下文)。

我有很多我正在使用的文字(我正在创建lexing / parsing语法)。对我来说,保持这些复杂的语法尽可能可读是很重要的,如果我将123_f重命名为{{},我个人认为factory(123)f(123)(甚至factory更具可读性{1}})。

我很想使用用户定义的文字,但据我所知,我无法捕捉用户定义文字的某种“工作环境”。我对用户定义的文字的理解是它们是在全局范围内定义的,因此只能访问全局对象,这是我想要避免的(我在整个项目中有不同的语法)。

有没有办法创建一个适用于某些本地上下文的用户定义文字?

0 个答案:

没有答案