gpt4 book ai didi

c++ - 我可以获得正式而非实际模板参数的字符串表示形式吗?

转载 作者:太空狗 更新时间:2023-10-29 22:59:55 25 4
gpt4 key购买 nike

假设我有以下内容:

class Foo { };
template <typename T> class Bar { };
template <typename NiftyType> class Baz { };

在现代(大概)C++ 中,我可以使用:

typeid(Foo).name()  // to will produce "Foo", or
typeid(Bar<int>).name() // to produce "Bar<int>"

但是最后一行给了我实际的模板参数;我想要正式的。也就是说,我希望能够说:

magic<Bar<int>>(); // to produce "Bar<typename T>" or just "T", and
magic<Baz<int>>(); // to produce "Bar<typename Nifty>" or just "Nifty"

我能以某种方式做到这一点吗?

(明显)注释:

  • 请不要只是上课。
  • 我无法检测类型(如果您对此要求不满意,请假设这不是我的代码)。但是,我猜可以容忍使用某种混合类的部分解决方案...
  • 我不想手动将适当的字符串写入某些映射。

最佳答案

怎么样

class Foo { };
template <typename T> class Bar {
static const char * debug_name() { return "Bar<typename T>"; }
};
template <typename NiftyType> class Baz {
static const char * debug_name() { return "Baz<typename NiftyType>"; }
};

然后你可以像这样定义magic:

template <typename T>
struct magic {
operator const char * () { return T::debug_name(); }
};

随心所欲地使用它

int main() {
magic<Bar<int>>();
magic<Baz<int>>();
}

我认为,根据我的 C++ 经验,要求编译器为您生成 debug_name 是很有希望的。 C++ 是一种很好用的语言,但是内省(introspection)绝对不是它的强项,你要求内省(introspection)到一个模板,而不仅仅是一个类型。

请注意,如果编译器被迫支持你所要求的作为内置的东西,它有效地禁止编译器解析模板定义并丢弃模板参数的(不相关的)标识符名称,并且仅存储已解析的模板定义的 AST 形式,它可能希望这样做以减少内存使用。或者它可能必须对源进行第二次传递以再次获取名称或其他可怕的事情。

我觉得有一些远没有你所要求的那么雄心勃勃的事情是不可能的,或者只有一种可能使用各种编译器特定的扩展。

关于c++ - 我可以获得正式而非实际模板参数的字符串表示形式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35385576/

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