gpt4 book ai didi

c++ - 可以将名称作为参数传递给 C++ 模板吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:21 25 4
gpt4 key购买 nike

是否可以写一个类:

template<typename T, ... name> struct Magic {
T name;
};

这样:

Magic<int, foo> gives:

Magic<int, foo> {
int foo;
}

Magic<float, bar> gives:

Magic<float, bar> {
float bar;
}

基本上,我不仅希望能够指定类型,还希望能够指定成员变量的名称。

最佳答案

这是不可能的,您必须求助于基于宏的解决方案或使用一组提供命名成员的预定义类型。

一种可能的基于宏的方法:

#define MAGIC(name_) \
template<typename T> struct Magic1 { \
T name_; \
};

MAGIC(foo);

或:

#define MAGIC(type_, name_) \
struct Magic1 { \
type_ name_; \
};

MAGIC(foo);

使用预处理器魔法,例如利用 Boost.Preprocessor ,您应该能够以更方便的方式生成 n 个命名成员。

另一种方法可能是使用一组预定义的类来提供您继承的某些命名成员:

enum { MemberNameFoo, MemberNameBar };

template<class T, int id>
struct named_member;

template<class T>
struct named_member<T, MemberNameFoo> {
T foo;
};

template<class T>
struct named_member<T, MemberNameBar> {
T bar;
};

// holder for the above, just one member for this example:

template<class T, int name>
struct holder : named_member<T, name> {};

// using it:

typedef holder<int, MemberNameFoo> HasFoo;
typedef holder<int, MemberNameBar> HasBar;

然后使用编译时列表,您可以从 n named_member 实例继承,Boost.MPL可以在这里提供帮助。

关于c++ - 可以将名称作为参数传递给 C++ 模板吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2293338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com