有没有办法在 C++ 中使用类型文字?
Is there a way to have type literals in C++?
现在,我正在尝试用 C++ 创建一个原型动态类型系统,以回答 Stack Overflow 上的另一个问题。
但是,我想知道如何才能 select 从变体中提取特定类型。
我想要的基本上是一个将键直接转换为类型的函数,然后让程序根据该类型文字构造一个类型。
我想要的(伪代码):
std::string type;
TYPE get_type(std::string) { ... }
get_type(type) new_variable();
使用连续传递样式,排序。
template<class T>struct tag{using type=T;};
template<class Tag>using type_t=typename Tag::type;
#define TYPEOF(...) type_t<std::decay_t<decltype(__VA_ARGS__)>>
template<class F>
auto get_type( std::string s, F f ) {
if (s=="int")
return f(tag<int>{});
if (s=="double")
return f(tag<double>{});
}
使用:
void do_stuff( std::string type ) {
int x = get_type( type, [&](auto tag) {
TYPEOF(tag) var;
return 7;
});
}
在这种情况下,var
是 type
命名的类型的变量。
请注意,所有分支都将被编译,因此所有分支都必须生成有效代码。
否则,不,这是不可能的,除非 constexpr
魔法。
现在,我正在尝试用 C++ 创建一个原型动态类型系统,以回答 Stack Overflow 上的另一个问题。
但是,我想知道如何才能 select 从变体中提取特定类型。
我想要的基本上是一个将键直接转换为类型的函数,然后让程序根据该类型文字构造一个类型。
我想要的(伪代码):
std::string type;
TYPE get_type(std::string) { ... }
get_type(type) new_variable();
使用连续传递样式,排序。
template<class T>struct tag{using type=T;};
template<class Tag>using type_t=typename Tag::type;
#define TYPEOF(...) type_t<std::decay_t<decltype(__VA_ARGS__)>>
template<class F>
auto get_type( std::string s, F f ) {
if (s=="int")
return f(tag<int>{});
if (s=="double")
return f(tag<double>{});
}
使用:
void do_stuff( std::string type ) {
int x = get_type( type, [&](auto tag) {
TYPEOF(tag) var;
return 7;
});
}
在这种情况下,var
是 type
命名的类型的变量。
请注意,所有分支都将被编译,因此所有分支都必须生成有效代码。
否则,不,这是不可能的,除非 constexpr
魔法。