C++ c++;使用模板生成最通用的函数
我需要创建一个尽可能通用的函数,假设我有两个C++ c++;使用模板生成最通用的函数,c++,templates,c++11,C++,Templates,C++11,我需要创建一个尽可能通用的函数,假设我有两个maps要处理-- 现在,如果我想编写一个能与任何类型的map(即map模板实例化中的代码是用来编译的。因此,当根据模板参数的类型执行不同的操作时,通常不能将它们包含在一个函数中。相反,您应该将处理委托给一个适当重载的函数,该函数本身可能是一个条件适用的模板例如,您的dosomething()函数可能如下所示: // suitable declaration/definition of dosomething_apply() go here; see
map
s要处理--
现在,如果我想编写一个能与任何类型的
map
(即map模板实例化中的代码是用来编译的。因此,当根据模板参数的类型执行不同的操作时,通常不能将它们包含在一个函数中。相反,您应该将处理委托给一个适当重载的函数,该函数本身可能是一个条件适用的模板例如,您的dosomething()
函数可能如下所示:
// suitable declaration/definition of dosomething_apply() go here; see below
template <typename A, typename B>
void dosomething(std::map<A, B> const& m) {
for (auto&& me: m) {
dosomething_apply(me.second);
}
}
它只是创建了trait的默认版本,声明trait不是通过派生自std::false_type
来匹配的。然后,对应的模板被专门化为上面列出的类模板,每个模板都是从std::true_type
派生的。这样一来,形式的表达式就是\u specialized::value
can用于检测该特征是否适用于类型T
下一步是提供合适的处理函数。由于特征存在或不存在,使用enable\u if\u t
是一种简单的方法:
template <typename T>
std::enable_if_t<!is_subscripted<T>::value>
dosomething_apply(T const& value) {
std::cout << "value=" << value << '\n';
}
template <typename T>
std::enable_if_t<is_subscripted<T>::value>
dosomething_apply(T const& range) {
for (auto size(range.size()), i(size - size); i != size; ++i) {
std::cout << "range=" << range[i] << '\n';
}
}
模板实例化中的代码用于编译。因此,当根据模板参数的类型执行不同的操作时,通常不能将它们包含在一个函数中。相反,您应该将处理委托给适当重载的函数,该函数本身可能是条件适用的模板。例如,dosomething()
函数可能如下所示:
// suitable declaration/definition of dosomething_apply() go here; see below
template <typename A, typename B>
void dosomething(std::map<A, B> const& m) {
for (auto&& me: m) {
dosomething_apply(me.second);
}
}
它只是创建了trait的默认版本,声明trait不是通过派生自std::false_type
来匹配的。然后,对应的模板被专门化为上面列出的类模板,每个模板都是从std::true_type
派生的。这样一来,形式的表达式就是\u specialized::value
can用于检测该特征是否适用于类型T
下一步是提供合适的处理函数。由于特征存在或不存在,使用enable\u if\u t
是一种简单的方法:
template <typename T>
std::enable_if_t<!is_subscripted<T>::value>
dosomething_apply(T const& value) {
std::cout << "value=" << value << '\n';
}
template <typename T>
std::enable_if_t<is_subscripted<T>::value>
dosomething_apply(T const& range) {
for (auto size(range.size()), i(size - size); i != size; ++i) {
std::cout << "range=" << range[i] << '\n';
}
}
模板实例化中的代码用于编译。因此,当根据模板参数的类型执行不同的操作时,通常不能将它们包含在一个函数中。相反,您应该将处理委托给适当重载的函数,该函数本身可能是条件适用的模板。例如,dosomething()
函数可能如下所示:
// suitable declaration/definition of dosomething_apply() go here; see below
template <typename A, typename B>
void dosomething(std::map<A, B> const& m) {
for (auto&& me: m) {
dosomething_apply(me.second);
}
}
它只是创建了trait的默认版本,声明trait不是通过派生自std::false_type
来匹配的。然后,对应的模板被专门化为上面列出的类模板,每个模板都是从std::true_type
派生的。这样一来,形式的表达式就是\u specialized::value
can用于检测该特征是否适用于类型T
下一步是提供合适的处理函数。由于特征存在或不存在,使用enable\u if\u t
是一种简单的方法:
template <typename T>
std::enable_if_t<!is_subscripted<T>::value>
dosomething_apply(T const& value) {
std::cout << "value=" << value << '\n';
}
template <typename T>
std::enable_if_t<is_subscripted<T>::value>
dosomething_apply(T const& range) {
for (auto size(range.size()), i(size - size); i != size; ++i) {
std::cout << "range=" << range[i] << '\n';
}
}
模板实例化中的代码用于编译。因此,当根据模板参数的类型执行不同的操作时,通常不能将它们包含在一个函数中。相反,您应该将处理委托给适当重载的函数,该函数本身可能是条件适用的模板。例如,dosomething()
函数可能如下所示:
// suitable declaration/definition of dosomething_apply() go here; see below
template <typename A, typename B>
void dosomething(std::map<A, B> const& m) {
for (auto&& me: m) {
dosomething_apply(me.second);
}
}
它只是创建了trait的默认版本,声明trait不是通过派生自std::false_type
来匹配的。然后,对应的模板被专门化为上面列出的类模板,每个模板都是从std::true_type
派生的。这样一来,形式的表达式就是\u specialized::value
can用于检测该特征是否适用于类型T
下一步是提供合适的处理函数。由于特征存在或不存在,使用enable\u if\u t
是一种简单的方法:
template <typename T>
std::enable_if_t<!is_subscripted<T>::value>
dosomething_apply(T const& value) {
std::cout << "value=" << value << '\n';
}
template <typename T>
std::enable_if_t<is_subscripted<T>::value>
dosomething_apply(T const& range) {
for (auto size(range.size()), i(size - size); i != size; ++i) {
std::cout << "range=" << range[i] << '\n';
}
}
你所说的“B的类型是单例”是什么意思?这里的单例是什么意思?你可能在寻找。单例指的是一个不是标准容器类型的对象/变量@0x499602D2@chris“印刷”不是这里的主要目标,这个dump
函数只是一个例子,它可以是任何东西。好的,这个实现是开源的,所以请随时注意它使用的技术并根据需要应用它们。你说的“B的类型是单例”是什么意思.这里的singleton是什么意思?您可能正在查找。我所说的singleton是指不是标准容器类型的对象/变量@0x499602D2@chris“印刷”不是这里的主要目标,这个dump
函数只是一个例子,它可以是任何东西。好的,这个实现是开源的,所以请随时注意它使用的技术并根据需要应用它们。你说的“B的类型是单例”是什么意思.这里的singleton是什么意思?您可能正在查找。我所说的singleton是指不是标准容器类型的对象/变量@0x499602D2@chris“印刷”不是这里的主要目标,这个dump
函数只是一个例子,它可以是任何东西。好的,这个实现是开源的,所以请随时注意它使用的技术并根据需要应用它们。你说的“B的类型是单例”是什么意思.这里的singleton是什么意思?您可能正在查找。我所说的singleton是指不是标准容器类型的对象/变量@0x499602D2@chris“印刷”不是这里的主要目标,这个dump
函数只是一个例子,它可以是任何东西。好的,这个实现是开源的,所以请随时注意它使用的技术并应用它们