【问题标题】:Is there a way to have type literals in C++?有没有办法在 C++ 中使用类型文字?
【发布时间】:2015-08-08 01:33:32
【问题描述】:

现在,我正在尝试用 C++ 创建一个原型动态类型系统,以回答有关 Stack Overflow 的另一个问题。

但是,我想知道如何才能从变体中选择特定类型。

我想要的基本上是一个将键直接转换为类型的函数,然后让程序根据该类型文字构造一个类型。

我想要什么(伪代码):

std::string type;

TYPE get_type(std::string) { ... }

get_type(type) new_variable();

【问题讨论】:

  • @Galik 我不确定,但我倾向于说不,因为我认为 C++ 中没有 eval() 等价物,因此如果您不能动态评估,则允许可变字符串文字运算符毫无意义运行时的 C++ 代码。
  • 返回(编译时)类型不能依赖于 std::string 的(运行时)值。
  • @Jarod42 我只是想知道是否可以缩小运行时变体。
  • 您一直在指变体,但该术语通常用于指代可区分联合的管理对象,因此单个编译时对象可以在运行时有效存储多种类型中的任何一种,我不'看不出这与您的问题或示例代码有何关系。如果您只是说您希望 get_type 适用于多种类型,为什么不使用模板专业化来列出映射?很容易。

标签: c++ type-conversion dynamic-typing static-typing


【解决方案1】:

使用延续传递风格,sortof。

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;
  });
}

在这种情况下,vartype 命名的类型的变量。

注意所有的分支都会被编译,所以所有的分支都必须产生有效的代码。

否则,不,这是不可能的,除非 constexpr 魔法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多