【发布时间】:2019-04-08 02:02:50
【问题描述】:
我有下一条命令:
auto result = Builder::get(
ObjKey("key1"),
ObjVal("test1"),
(ObjKey("key2"), ObjVal("test21"), (ObjKey("key3"), ObjVal("test31"), ObjVal("test32")), ObjVal("test22")),
ObjVal("test2")
);
我希望得到以下结果:
{key1, test1, {key2, test21, {key3, test31, test32}, test22}, test2}
但我得到了这个结果:
{key1, test1, test22, test2}
程序代码如下(标准11):
#include <iostream>
class ObjKey {
public:
ObjKey() = delete;
ObjKey(const std::string& key) : m_key(key) { }
std::string get() const {
return m_key + ", ";
}
private:
std::string m_key;
};
class ObjVal {
public:
ObjVal() = delete;
ObjVal(const std::string& value) : m_value(value) { }
std::string get() const {
return m_value + ", ";
}
private:
std::string m_value;
};
class Builder {
public:
template<typename... Args>
static std::string get(ObjKey&& objKey, Args&& ...args) {
std::string resultValue;
get(resultValue, std::forward<ObjKey>(objKey), std::forward<Args>(args)...);
return resultValue;
}
private:
Builder() {}
template<typename... Args>
static void get(std::string& resultValue, ObjKey&& objKey, Args&& ...args) {
resultValue.append("{");
resultValue.append(objKey.get());
std::string values;
get(values, std::forward<Args>(args)...);
resultValue.append(values);
resultValue.append("}");
}
template<typename... Args>
static void get(std::string& resultValue, ObjVal&& objVal, Args&& ...args) {
resultValue.append(objVal.get());
get(resultValue, std::forward<Args>(args)...);
}
static void get(std::string& resultValue) {}
};
int main()
{
auto result = Builder::get(
ObjKey("key1"),
ObjVal("test1"),
(ObjKey("key2"), ObjVal("test21"), (ObjKey("key3"), ObjVal("test31"), ObjVal("test32")), ObjVal("test22")),
ObjVal("test2")
);
std::cout << result << "\n";
}
我做错了什么?
用模板可以解决吗?
【问题讨论】:
-
(ObjKey("key2"), ObjVal("test21"), (ObjKey("key3"), ObjVal("test31"), ObjVal("test32")), ObjVal("test22")))你觉得这个表达式的值是多少? -
它是树:ObjKey("key1") ObjVal("test1"), ObjKey("key2") ObjVal("test21") ObjKey("key3") ObjVal("test31") ObjVal ("test32") ObjVal("test22") ObjVal("test2")
-
我希望你明白它不是一棵树。您的代码中没有任何内容会创建树。我建议创建一个 Tree 类。
标签: c++11 templates tree variadic-templates variadic