原文
你最好实现接受参数
并在Variant
中包装的函数
.
这是我想出的最好的,应该可复制/粘贴
到其他代码中:
void foo(Variant x, Variant y) {
... }
import std.meta : allSatisfy;
enum isVariant(T) = is(T == Variant);
//这会在`CTFE`很糟糕,但是...
string argsAsVariants(size_t count)
{
import std.format;
import std.range;
import std.alglorithm;
import std.array;
return iota(count).map!(i => format("Variant(args[%s])", i).join(",");
}
//垫片
auto foo(Args...)(Args args) if (!allSatisfy!(isVariant, Args))
{
mixin("return foo(", argsAsVariants(args.length), ");");
}
-史蒂夫
同一主题
的另一个变体
:
void foo(Variant x, Variant y)
{
import std.stdio: writeln;
writeln("x = ", x);
writeln("y = ", y);
}
//在变参列表上映射
template mapArgs(alias fun)
{
auto mapArgs(Args...)(auto ref Args args)
{
import std.typecons: tuple;
import core.lifetime: forward;
import std.meta: Map = staticMap;
auto ref mapArg(alias arg)()
{
return fun(forward!arg);
}
return tuple(Map!(mapArg, args));
}
}
import std.variant: Variant;
import std.meta: allSatisfy;
enum isVariant(T) = is(T == Variant);
auto foo(Args...)(Args args)
if (!allSatisfy!(isVariant, Args))
{
return .foo(mapArgs!Variant(args).expand);
}
void main()
{
foo(123, 456);
foo("hello", "world");
}