C++ C++;变长参数函数
我试图编写一个函数,它遍历一个深度可变的XML节点并找到一个值。递归变量函数似乎是一个很好的解决方案,所以我尝试了这个C++ C++;变长参数函数,c++,C++,我试图编写一个函数,它遍历一个深度可变的XML节点并找到一个值。递归变量函数似乎是一个很好的解决方案,所以我尝试了这个 struct MiniNode { std::string getAttributeString(std::string s) {} MiniNode getChildByKey(std::string s) {} }; static std::string getFromNodeDefault(MiniNode* node, std::string&
struct MiniNode {
std::string getAttributeString(std::string s) {}
MiniNode getChildByKey(std::string s) {}
};
static std::string getFromNodeDefault(MiniNode* node, std::string& def, std::string& key) {
try {
return node->getAttributeString(key);
} catch (...) {
return def;
}
}
static std::string getFromNodeDefault(MiniNode* node, std::string& def, std::string& key, std::string&... args) {
try {
return getFromNodeDefault(node->getChildByKey(key), def, args...);
} catch (...) {
return def;
}
}
但是编译器抱怨说
main.cpp:20:91: error: expansion pattern 'Args&' contains no argument packs main.cpp: In function 'std::string getFromNodeDefault(MiniNode*, std::string&, T&)':
main.cpp:22:67: error: 'args' was not declared in this scope
return getFromNodeDefault(node->getChildByKey(key), def, args...);
我在这里以第二个答案的一部分为例,没有使用模板,因为我知道我的类型
有没有关于我在这里做错了什么的提示?请尝试以下操作:
static std::string getFromNodeDefault(MiniNode* node, std::string& def,std::string& key) {
try {
return node->getAttributeString(key);
}
catch (...) {
return def;
}
}
template<typename... T>
static std::string getFromNodeDefault(MiniNode* node, std::string& def,
std::string& key, T&... args) {
try {
return getFromNodeDefault(node->getChildByKey(key), def, args...);
}
catch (...) {
return def;
}
}
static std::string getFromNodeDefault(迷你节点*节点,std::string&def,std::string&key){
试一试{
返回节点->getAttributeString(键);
}
捕获(…){
返回def;
}
}
模板
静态std::string getFromNodeDefault(MiniNode*节点,std::string&def,
std::字符串和键,T&…args){
试一试{
返回getFromNodeDefault(节点->getChildByKey(键)、def、args…);
}
捕获(…){
返回def;
}
}
您需要使用该模板。您可以做的是static\u assert
确认类型是您所期望的,或者确认类型是您所期望的,将其转换为模板修复了问题。@Justin。我提到了那个问题,不确定它是否重复。我并不完全清楚必须使用模板。你很难编译这个-std::string&。。。args
。