2015-10-09 16 views
6

मैं यह निर्धारित करने का एक मजबूत तरीका उठाने की कोशिश कर रहा हूं कि दिया गया प्रतीक एक फ़ंक्शन टेम्पलेट है या नहीं। निम्नलिखित:यह निर्धारित करना कि कोई प्रतीक एक टेम्पलेट फ़ंक्शन है

import std.traits: isSomeFunction; 

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

static assert(isSomeFunction!identity); 

identity के रूप में असफल होगा अभी भी एक टेम्पलेट जब तक यह instantiated जाता है।

//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 पार्स की तुलना में इस दूसरे करने के लिए एक बेहतर तरीका है जानना चाहते हैं: वर्तमान में मैं एक हैक है कि तथ्य पर निर्भर करता है कि <template function symbol>.stringof एक निश्चित तरीके से स्वरूपित किया गया है का उपयोग कर रहा हूँ।

+0

स्ट्रिंग जो आपको प्राप्त करने जा रहा है, वह सबसे अच्छा हो सकता है क्योंकि आपको टेम्पलेट को तुरंत चालू करना होगा और वास्तव में ऐसा करने के लिए कोई गारंटी नहीं है। (एक 'अगर (झूठी)' बाधा के साथ एक पर विचार करें, यह कभी भी अंदर आने के लिए असंभव होगा)। –

उत्तर

0

ऐसा लगता है कि डी में ऐसा करने का कोई बेहतर तरीका नहीं है, इसलिए अब मैं पार्सिंग कर रहा हूं। स्ट्रिंगोफ, जैसा कि हैक गंदा है।

संबंधित मुद्दे