我正在使用xsd从xml架构文件创建c ++代码.对于xml类型,创建了多个函数(用于序列化等).
如果类型被称为XmlType,则创建以下形式的多个函数:
XmlType XmlType_(const XmlType& a, const string& b)
string XmlType_(const XmlType& a)
...
Run Code Online (Sandbox Code Playgroud)
这是普通函数,而不是XmlType的成员,它们都具有相同的名称.对于XmlType2,函数将被称为XmlType2_.
我想为我的xml方案的所有不同xml类型编写一个实用程序模板类.不同的功能将在本课程中被称为洞察力.到目前为止我所拥有的是这样的:
template<typename T>
using TFunc1 = T (*)(const T&, const string&);
template<typename T>
using TFunc2 = string (*)(const T&);
template<typename T, TFunc1<T> func2, TFunc2<T> func2>
class XmlUtil {
...
};
Run Code Online (Sandbox Code Playgroud)
当创建XmlUtil类的实例时,如果必须这样做:
XmlUtil<XmlType, XmlType_, XmlType_> util;
Run Code Online (Sandbox Code Playgroud)
当我必须传递更多函数作为参数时,这感觉有点多余并且变得更糟.
我想像这样使用util类:
XmlUtil<XmlType, XmlType_> util;
Run Code Online (Sandbox Code Playgroud)
或者甚至更好
XmlUtil<XmlType> util;
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法是以某种方式使用define,但感觉不对.
还有其他办法吗?
编辑: 我现在正在使用一个定义:
#define TRPL(name) name, name ## _, name …Run Code Online (Sandbox Code Playgroud) 在今年的主题演讲中,Going Native C++的本质(转到40:30)Bjarne Stroustrup给出了以下代码示例:
template<typename C, typename V>
vector<Value_type<C>*> find_all(C& cont, V v)
{
vector<Value_type<C>*> res;
for (auto& x : cont)
if (x == v)
res.push_back(&x)
return res;
}
Run Code Online (Sandbox Code Playgroud)
此函数用于查找容器中所有值的值,并返回指向找到的元素的指针.视频中的示例:
string m{"Mary had a little lamb"};
for (const auto p: find_all(m,'a')) // p is a char*
if (*p != 'a')
cerr << "string bug!\n";
Run Code Online (Sandbox Code Playgroud)
我的问题是关于Value_Type<C>*.标准库中有这样的东西吗?我寻找它并没有找到它.如果它不在std中,怎么能实现呢?
我在Windows 7上使用Vim 7.3并在我的vimrc中进行以下设置:
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4
Run Code Online (Sandbox Code Playgroud)
如果我在'插入模式'中使用Tab或在'命令模式'中使用>>,我的文本缩进4个空格.但是如果我在'冒号命令模式'中使用>>(我不知道它是否真的被称为),例如使用范围
:30,35>>
Run Code Online (Sandbox Code Playgroud)
文本仍然缩进8个空格.
将此更改为4个空格的正确设置是什么?