gpt4 book ai didi

templates - 测试别名是否是 D 2.0 中的模板

转载 作者:行者123 更新时间:2023-12-04 14:34:24 24 4
gpt4 key购买 nike

如何测试别名是否是 D 2.0 中的模板?

template isTemplate(alias T)
{
enum bool isTemplate = ???;
}

更新:

它应该像这样工作:
struct S(T)
{
int opCall() { return 0; }
int opUnary(string s)() if (s == "-") { return 0; }
}

pragma(msg, isTemplate!(S)); //Should print true
pragma(msg, isTemplate!(S!(int))); //Should print false
pragma(msg, isTemplate!((S!(int)).opCall)); //Should print false
pragma(msg, isTemplate!((S!(int)).opUnary)); //Should print true

作为引用,不起作用的事情:
  • 您不能使用任何表达式,例如 T!(...)因为你不知道用什么来代替椭圆。
  • 你不能说&T因为如果你只是给了一个普通的旧类型名称,那也不起作用。
  • 最佳答案

    除了我在 the other answer 中列出的 2 个测试之外,这通过了所有测试。

    import std.algorithm : startsWith, canFind;

    template isTemplate(alias B) {
    enum isTemplate = !__traits(compiles, {auto x=B;}) // excludes values
    && !__traits(compiles, {B x;}) // excludes types
    && __traits(compiles, {alias B x;}) // excludes instance members
    && !B.stringof.startsWith("module ", "package ") // excludes modules
    && !B.stringof.canFind("!("); // excludes instantiated templates
    }

    失败的 2 个测试如下:
    struct Inner2(string U="!(") {}
    static assert(isTemplate(Inner2));

    如果您确定模板没有包含 "...!(..." 的默认参数我认为使用它是安全的。

    关于templates - 测试别名是否是 D 2.0 中的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5483381/

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