c++ 17 constexpr
未来已来:从SFINAE到concepts
#include <type_traits>
#include <vector>
#include <list>
#include <iostream>
// 一个通用的容器打印函数,支持任何带 begin()/end() 的容器
template<typename Container>
auto print_container(const Container& c) ->
decltype(std::begin(c), std::end(c), void()) {
std::cout << "容器内容: ";
for (const auto& item : c) {
std::cout << item << " ";
}
std::cout << std::endl;
}
// 对于不是容器的类型,提供一个普通的打印函数
template<typename T>
void print(const T& value) {
std::cout << "单个值: " << value << std::endl;
}
// 智能函数:自动选择合适的打印方式
template<typename T>
void smart_print(const T& value) {
// 尝试作为容器打印,如果失败就作为单个值打印
if constexpr (requires { std::begin(value); std::end(value); }) {
print_container(value);
} else {
print(value);
}
}
int main() {
// 容器类型
std::vector<int> vec = {1, 2, 3, 4, 5};
std::list<double> lst = {1.1, 2.2, 3.3};
// 单个值
int x = 42;
std::string str = "hello";
// 自动选择合适的打印方式
smart_print(vec); // 使用容器版本
smart_print(lst); // 使用容器版本
smart_print(x); // 使用单值版本
smart_print(str); // 字符串既是容器也是单值,这里会作为容器处理
}