使用C ++模板编程来提取任意结构的字段类型

时间:2016-05-20 01:31:30

标签: c++ templates struct metaprogramming variadic-templates

如果我定义一个具有任意数据类型的结构,如:

struct custom_type {
    int a;
    float b;
    char c; 
    float *d; // etc...
};

是否存在使用模板编程(C ++)提取此结构的字段类型并在编译时将它们映射到某些特定于类型的代码处理程序的常见模式?

某些上下文:我正在创建一个api,允许客户端定义他们自己的任意自定义类型,并且仍然允许那些与我用于管理和内省这些类型的底层系统集成,执行自动内存管理和其他内务管理

“包装”模板或其他机制将允许此集成,而底层系统不知道有关定义自定义类型的头文件的任何信息。从客户端的角度来看,代码访问结构以正常方式,但模板允许对结构中的每个字段进行泛型处理。

感谢。

2 个答案:

答案 0 :(得分:1)

不,使用标准C ++语言中的模板或任何其他功能是不可能的。这种特征被称为内省或反思。如果您使用这些术语进行搜索,您会发现一些可以在构建时提供此类信息的外部工具(例如clang);生成后,您可以运行自定义工具执行代码生成。

答案 1 :(得分:0)

您描述的行为称为reflection。支持此功能的C ++语言功能非常有限(尚未)。但是,通过一些技巧,可以实现某种程度的反思。

一个例子是名为" boost / pfr" (精确和平面反射)作者:Antony Polukhin。这是one example from the README

// requires: C++14
#include <iostream>
#include <string>
#include "boost/pfr/precise.hpp"

struct some_person {
    std::string name;
    unsigned birth_year;
};

int main() {
    some_person val{"Edgar Allan Poe", 1809};

    std::cout << boost::pfr::get<0>(val)                // No macro!
        << " was born in " << boost::pfr::get<1>(val);  // Works with any aggregate initializables!
}

In the same README找到了要求(等等)

  
      
  • T必须是constexpr聚合初始化,且不得包含引用或位域
  •   

一些基础技术在recorded CppCon 2016 talk with the title "C++14 Reflections Without Macros, Markup nor External Tooling.."中解释。