美化变量模板化函数调用

时间:2014-12-01 13:45:30

标签: c++ templates

我有以下C ++代码段:

template_par<std::string> a("name", "Joh Node");
template_par<int> b("age", 23);
std::string result = templater<SomeTemplateClass>().templatize(a, b).get();

试图为各种目的实现模板引擎。 templater类的重要部分是:

template<class T>
class templater
{
    std::map<std::string, std::string> kps;

public:

    template <typename T1>
    templater& templatize(template_par<T1> b)
    {
        kps.insert(make_pair(b.getKey(), to_string(b.getValue())));
        return *this;
    }


    template<typename T1, typename... Args1>
    templater& templatize(T1 first, Args1... args)
    {
        kps.insert(make_pair(first.getKey(), to_string(first.getValue())));
        return templatize(args...);
    }
}

即。具有可变参数的模板函数.... template_par<T>只是基本内容的模板参数类。现在,这是有效的,做得很好。

然而,我希望能够以某种方式缩短我称之为templatize方法的方式,不仅仅是为了美学而且也是为了挑战......我认为这样看起来会更好:

  std::string result = templater<SomeTemplateClass>().templatize(
            "name" -> "Joh Node",
            "age"  -> 42
  );

然而这种方法是不可行的,因为operator ->是一个有点僵硬的C ++ ...(std::string result = templater<SomeTemplateClass>().templatize不是这里的重要部分,可以隐藏在友好的构造中,我我更担心可变数量的参数)

对于上述挑战有什么好的美化想法吗?

1 个答案:

答案 0 :(得分:2)

查看Boost.Assign,特别是地图分配部分,您可以在此处共同选择:

std::string result = templater<SomeTemplateClass>()
    ("Name", "Joh Node")
    ("Age", 42).templatize();

我会避免比这更有创意,它会让代码变得神秘。也就是说,如果你想疯狂地进行实验,你可能会喜欢我的named operators,这将允许语法如下:

std::string result = templater<SomeTemplateClass>().templatize(
    "name" <is> "Joh Node",
    "age"  <is> 42
);

这里,is可以是任何有效的C ++标识符。因此传统的运营商不幸出局,但几乎所有东西都过得很快。即使如果你 希望推送它,<_>