在D中,如何在所有整个元组上指定可变参数模板约束?

时间:2013-07-18 13:12:27

标签: variadic-templates d

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

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

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

显然这只会检查第一个模板参数,虽然它给出了我到目前为止编写的代码,但我希望我能说“仅适用于所有字符串”和“仅适用于所有字符串”。有办法吗?

2 个答案:

答案 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))) {
}