我试图提出一种确定给定符号是否为功能模板的可靠方法。以下:

import std.traits: isSomeFunction;

auto ref identity(T)(auto ref T t) { return t; }

static assert(isSomeFunction!identity);

将失败,因为identity仍是模板,直到被实例化。目前,我正在使用一种依赖于<template function symbol>.stringof格式化的事实的hack:
//ex: f.stringof == identity(T)(auto ref T t)
template isTemplateFunction(alias f)
{
    import std.algorithm: balancedParens, among;

    enum isTemplateFunction = __traits(isTemplate, f)
        && f.stringof.balancedParens('(', ')')
        && f.stringof.count('(') == 2
        && f.stringof.count(')') == 2;
}

//Passes
static assert(isTemplateFunction!identity);

我想知道是否有比hacky stringof解析更好的方法来做到这一点。

最佳答案

似乎现在没有更好的方法可以在D中执行此操作,因此我将坚持解析.stringof,因为它实际上是一个肮脏的hack。

关于template-meta-programming - 确定符号是否为模板函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33043839/

10-11 22:47