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

问题描述 投票:4回答:2

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

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

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

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

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

谢谢。

c++ templates struct metaprogramming variadic-templates
2个回答
1
投票

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


0
投票

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

一个例子是Antony Polukhin的名为“boost / pfr”(精确和平面反射)的图书馆。这是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.."中解释。

© www.soinside.com 2019 - 2024. All rights reserved.