2015-10-09 31 views
6

私は、与えられたシンボルが関数テンプレートであるかどうかを確かめる方法を考え出しています。次シンボルがテンプレートであるかどうかを調べる関数

import std.traits: isSomeFunction; 

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

static assert(isSomeFunction!identity); 

identityとして失敗し、それがインスタンス化されるまでは、まだテンプレートです。私はハックstringof解析よりも、この他を行うには良い方法があるかどうかを知りたいのですが

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

:現在、私は<template function symbol>.stringofは、特定の方法でフォーマットされているという事実に依存しているハックを使用しています。

+0

stringofは、それ以降のテストを行うために得られる最高のものかもしれません。テンプレートをインスタンス化する必要があり、実際にそれを行う保証された方法はありません。 ( 'if(false)'制約付きのものを考えてみると、内部に入ることは不可能です)。 –

答えて

0

今のところDでこれを行うには良い方法はないようですので、.stringofの解析に固執します。

関連する問題