C++中能否自定义支持<type>泛型形式的struct或类结构?
解答
完全可以,你提到的my_structure<type> variable;是C++ 类模板(包含结构体模板)的实例化语法,标准库的std::vector等容器都是通过这种语法实现的,你自己也可以自定义对应的模板类型。
基础示例
首先定义泛型结构体/类,只需要在声明前加template <typename T>即可,T就是你要传入的自定义类型参数:
// 自定义泛型结构体 template <typename T> struct my_structure { T stored_data; // 也可以添加泛型成员函数 void set_data(T input) { stored_data = input; } T get_data() const { return stored_data; } }; // 自定义泛型类写法和结构体完全一致,仅需把struct换成class即可 template <typename T> class my_class { T member; public: void set(T val) { member = val; } T get() const { return member; } };
定义完成后你就可以用你提到的语法声明实例:
// 实例化存储int类型的结构体 my_structure<int> int_struct; int_struct.set_data(100); // 实例化存储std::string类型的类 my_class<std::string> str_class; str_class.set("test content");
补充说明
- 模板的定义建议直接写在头文件中,C++模板的特性要求编译器实例化时必须看到完整定义,否则会出现链接错误
- 可以给模板参数设置默认值,例如
template <typename T = int> struct my_structure,之后可以直接用my_structure<> default_struct;使用默认的int类型参数 - 除了类型参数,模板还支持传入非类型参数,例如
template <typename T, size_t Size> struct my_array,实例化时可以写作my_array<int, 10> arr;,和标准库std::array的用法一致 - C++11及更高版本还支持可变参数模板,可以接受任意数量的类型参数,实现和
std::tuple一致的语法
内容的提问来源于stack exchange,提问作者Sigmarionid
相关产品推荐
相关产品推荐

