我在看这里,https://github.com/abseil/abseil-cpp/blob/master/absl/types/span.h#L673
template <int&... ExplicitArgumentBarrier, typename T>
constexpr Span<T> MakeSpan(T* ptr, size_t size) noexcept {
return Span<T>(ptr, size);
}
我不明白这个功能。int&... ExplicitArgumentBarrier
在做什么?它没有在函数中使用,所以我无法弄清楚为什么要使用它。
举一个例子来说明这是什么“诡计”以及为什么要使用它,我们将不胜感激。
发布于 2017-12-28 20:53:55
在错误代码中发现的一个常见模式是在函数模板中使用显式模板参数,否则会执行模板参数推导。
std::make_pair<int,std::string>(1729, "Hello World!");
这是多余的,在这种情况下,第二个参数的显式类型甚至与所推导的类型不同。
为了防止人们这样做,您可以在将要推导的参数前面放置一个各种各样的假模板参数,这样就没有人能够显式地命名这些参数。
显然,开发人员选择int&...
作为假参数的类型,但它可能是任何其他类型(也是另一种类型),并且为了提高代码的可读性,他们也给它起了一个名字,ExplicitArgumentBarrier
,这现在应该是有意义的。
发布于 2017-12-28 21:05:15
在评论中,你问,
我不太明白--按照你的说法,怎么叫
MakeSpan
?
这里有一个不使用MakeSpan
的演示程序。
template <typename ... T, typename T2> void foo(T2 arg) {}
template <int ... N, typename T2> void bar(T2 arg) {}
int main()
{
foo<int, int>(0); // T2 is deduced to be int
foo(0); // T2 is still deduced to be int
foo<int, int>(10.5); // T2 is deduced to be double
foo(10.5); // T2 is still deduced to be double
bar<10, 20, 30>(1); // T2 is deduced to be int
bar(1); // T2 is still deduced to be int
bar<10, 20, 30>(1.2); // T2 is deduced to be double
bar(1.2); // T2 is still deduced to be double
}
涉及MakeSpan
的函数调用如下所示:
int a;
int b;
auto s1 = MakeSpan(20); // T is deduced to be int
auto s1 = MakeSpan<a, b>(20); // T is still deduced to be int
忽略所有显式指定的模板参数。论证的类型总是被推导出来的。
https://stackoverflow.com/questions/48014146
复制相似问题