C++ 模板专题 - 变长模板

一:概述

        C++ 变长模板(Variadic Templates)允许你定义接受任意数量模板参数的模板。这种功能在 C++11 中引入,非常灵活,常用于实现类型安全的容器、函数等。变长模板基本语法:

template<typename... Args>
void func(Args... args) {
    // 函数体
}

二:示例: 

#include <iostream>

// 递归基础案例
void print() {
    std::cout << std::endl;
}

// 变长模板递归
template<typename T, typename... Args>
void print(T first, Args... args) {
    std::cout << first << " ";
    print(args...);  // 递归调用
}

int main() {
    print(1, 2.5, "hello", 'c');  // 输出: 1 2.5 hello c 
    return 0;
}
#include <iostream>

template <typename... Args>
int printSize(Args... args){
  return sizeof ...(args);
}

template<int ...>
struct Mult;

template<>
struct Mult<>{
  static const int value= 1;
};

template<int i, int ... tail>
struct Mult<i, tail ...>{
  static const int value= i * Mult<tail ...>::value;
};

int main(){

  std::cout << '\n';

  std::cout << "printSize(): " << printSize() << '\n';
  std::cout << "printSize(template,2011,true): " << printSize("template",2011,true) << '\n';
  std::cout << "printSize(1, 2.5, 4, 5, 10): " <<  printSize(1, 2.5, 4, 5, 10) << '\n';

  std::cout << '\n';

  std::cout << "Mult<10>::value: " << Mult<10>::value << '\n';
  std::cout << "Mult<10,10,10>::value: " << Mult<10,10,10>::value << '\n';
  std::cout << "Mult<1,2,3,4,5>::value: " << Mult<1,2,3,4,5>::value << '\n';

  std::cout << '\n';

}

三:注意事项

  • 类型匹配:在使用变长模板时,确保所有参数的类型正确匹配。编译器在处理变长模板时会检查类型。
  • 递归限制:过多的递归可能导致编译器的栈溢出,需谨慎使用。
  • 模板特化:可以对变长模板进行特化,以便为特定类型或数量的参数提供不同的实现。

猜你喜欢

转载自blog.csdn.net/zg260/article/details/143350650