#include <iostream>
#include <vector>
#include <algorithm>
#include <type_traits>
// 元编程辅助结构体,用于根据类型选择操作
template <typename T, typename Enable = void>
struct TypeSpecificOperation {
static T apply(T value) { return value; }
};
// 整数类型特化
template <typename T>
struct TypeSpecificOperation<T, std::enable_if_t<std::is_integral<T>::value>> {
static T apply(T value) { return value * 2; }
};
// 浮点数类型特化
template <typename T>
struct TypeSpecificOperation<T, std::enable_if_t<std::is_floating_point<T>::value>> {
static T apply(T value) { return value / 2; }
};
// 模板函数,接受一个容器并返回转换后的新容器
template <typename Container>
auto transformContainer(const Container& container) {
using value_type = typename Container::value_type;
std::vector<value_type> newContainer;
newContainer.reserve(container.size());
std::transform(container.begin(), container.end(), std::back_inserter(newContainer),
[](const value_type& value) {
return TypeSpecificOperation<value_type>::apply(value);
});
return newContainer;
}
元编程概念解释
- 类型萃取(Type Traits):
std::is_integral
和 std::is_floating_point
是C++标准库提供的类型萃取工具。它们用于在编译期判断一个类型是否为整数类型或浮点数类型。例如,std::is_integral<int>::value
在编译期会得到 true
,而 std::is_integral<float>::value
会得到 false
。
- SFINAE(Substitution Failure Is Not An Error):
std::enable_if_t
是利用SFINAE原则的工具。它通过在模板实例化时检查条件,如果条件不满足则导致模板替换失败,但这并不被视为错误,从而实现选择性地实例化模板。例如,TypeSpecificOperation<T, std::enable_if_t<std::is_integral<T>::value>>
只有当 T
是整数类型时才会实例化这个特化版本。
泛型编程技巧
- 模板参数推导:函数模板
transformContainer
利用模板参数推导,自动识别传入容器的类型,无需手动指定。
- 容器无关性:通过使用容器的
begin()
和 end()
成员函数以及标准库算法 std::transform
,代码可以处理任何支持这些接口的容器,如 std::vector
、std::list
等,实现了容器无关的编程。
- lambda 表达式:在
std::transform
中使用 lambda 表达式来调用 TypeSpecificOperation
的 apply
方法,简洁地实现了对每个元素的类型特定操作。