arrays - 确定模板参数是否是持有相同非限定类型的数组

标签 arrays templates d type-traits

我正在尝试制作一个模板来确定参数是否是持有相同非限定类型的数组。

template sameUnqualArrays(A, B) {
  enum bool sameUnqualArrays = isArray!A && isArray!B &&
      is(Unqual!(ForeachType!A) == Unqual!(ForeachType!B));
}

unittest {
  static assert(sameUnqualArrays!(ubyte[], immutable(ubyte[])));
  static assert(!sameUnqualArrays!(ubyte[], immutable(byte[])));
  static assert(!sameUnqualArrays!(ubyte[], ubyte));
}

不幸的是,最后一个断言没有通过,但给出了错误: /usr/include/dmd/phobos/std/traits.d(6062,9):错误:无效的 foreach 聚合转换(ubyte)0u

这是一个错误吗?如何解决这个问题?有没有更简单的方法来实现这一目标?

最佳答案

嗯,看来短路评估在这里不起作用?这可能是一个错误,但解决方法很简单:

import std.traits;

template sameUnqualArrays(A, B) {
  static if (isArray!A && isArray!B)
    enum bool sameUnqualArrays =
      is(Unqual!(ForeachType!A) == Unqual!(ForeachType!B));
  else
    enum bool sameUnqualArrays = false;
}

unittest {
  static assert(sameUnqualArrays!(ubyte[], immutable(ubyte[])));
  static assert(!sameUnqualArrays!(ubyte[], immutable(byte[])));
  static assert(!sameUnqualArrays!(ubyte[], ubyte));
}

关于arrays - 确定模板参数是否是持有相同非限定类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32549426/

相关文章:

c++ - float 最大化循环在 D 中不终止,在 C++ 中有效

while-loop - 如何在D中实现while循环?

javascript - 如何获取/获取函数的所有参数?

c++ - 从 C++ 中的函数返回指针

C++ 模板 : Getting wrong results (output) with MInGW

c++ - 将 boost::make_recursive_variant 与元组一起使用

d - std.algorithm.find 应该要求对范围元素的引用吗?

javascript - 有没有办法进一步简化这些 javascript 函数?

javascript - 使用javascript在循环中动态创建数组

c++ - 为什么将 const 对象传递给需要非常量模板类型参数的模板化函数会导致编译错误?