当前位置:   article > 正文

2402d,d变量2

2402d,d变量2

原文
你最好实现接受参数并在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), ");");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

-史蒂夫
同一主题另一个变体:

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");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/111238
推荐阅读
  

闽ICP备14008679号