4

我正在编写一个函数的 2 个重载,它们都带有可变参数模板编译时参数。一个应该以符号作为模板,其他字符串。我想将模板实例化限制为这两种情况。我想出的最好的是:

bool func(SYMBOLS...)() if(!is(typeof(SYMBOLS[0]) == string)) {
}

bool func(STRINGS...)() if(is(typeof(STRINGS[0]) == string)) {
}

显然,这只检查第一个模板参数,虽然它在给定我迄今为止编写的代码的情况下有效,但我希望我可以说“仅适用于所有字符串”和“仅适用于并非所有字符串”。有办法吗?

4

2 回答 2

6

我花了一段时间才弄清楚,但这里有一个可能解决您的问题的方法:

module main;

import std.stdio;

int main(string[] argv)
{
    bool test1PASS = func(1,2,3,4,5.5, true);
    //bool test2CTE = func(1,2,3,4,5, true, "CRAP");
    bool test3PASS = func("CRAP", "3", "true");
    //bool test4CTE = func("CRAP", "3", "true", 42, true, 6.5);

    return 0;
}

bool func(NOSTRINGS...)(NOSTRINGS x) 
    if ({foreach(t; NOSTRINGS) if (is(t == string)) return false; return true; }()) {

    // code here ...
    return true;
}

bool func(ONLYSTRINGS...)(ONLYSTRINGS x) 
    if ({foreach(t; ONLYSTRINGS) if (!is(t == string)) return false; return true; }()) {

    // code here ...
    return true;
}
于 2013-07-18T15:39:26.697 回答
6

这有效(来自http://forum.dlang.org/thread/qyosftfkxadeypzvtvpk@forum.dlang.org在 Andrej Mitrovic 的帮助下):

import std.traits;
import std.typetuple;

void runTests(SYMBOLS...)() if(!anySatisfy!(isSomeString, typeof(SYMBOLS))) {
}

void runTests(STRINGS...)() if(allSatisfy!(isSomeString, typeof(STRINGS))) {
}
于 2013-07-18T16:24:10.283 回答