赞
踩
原文
你最好实现接受参数
并在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"); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。