我正在写一个函数的2个重载,它们都带有可变参数模板编译时参数。应该将符号作为模板,其他字符串。我想将模板实例化约束到这两种情况。我想出的最好的是:
bool func(SYMBOLS...)() if(!is(typeof(SYMBOLS[0]) == string)) {
}
和
bool func(STRINGS...)() if(is(typeof(STRINGS[0]) == string)) {
}
显然这只会检查第一个模板参数,虽然它给出了我到目前为止编写的代码,但我希望我能说“仅适用于所有字符串”和“仅适用于所有字符串”。有办法吗?
答案 0 :(得分: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;
}
答案 1 :(得分: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))) {
}