【发布时间】:2019-01-31 20:40:50
【问题描述】:
我看过 Bjarne stroustrup 的演讲,题目是“概念泛型编程的未来”,我想也许我可以用 C++17 编写“概念”... 但我是一名 C 程序员,大约 6 个月前我开始使用 C++ ......所以我不知道为什么,但我在这段代码中遇到了麻烦。有人可以帮助我吗?
我用一个简短的 tmp 代码实现了 Addable 的概念... 这个想法是在 C++20 中将是这样的:
template<typename T>
concept Summable = requires(T x) { x + x; };
template<typename T> requires Summable<T>
T sum(T n1, T n2) {
return n1 + n2;
}
而这段代码实际上是 C++17 中的代码:
template <typename, typename, typename = void>
struct Addable : std::false_type {};
template <typename T, typename U>
struct Addable < T, U,
std::void_t<decltype(std::declval<T&>()+std::declval<U&>())> >
: std::true_type {};
上面的代码可以编译,但是当我写下面的代码时没有编译...
template<typename Head, typename ... Tail>
auto sum(Head h, Tail ... args) {
static_assert(Addable<Head, Tail...>::value, "Requires addable objects");
return h+(args+...);
}
【问题讨论】:
-
Addable<Head, Tail...>::value如果Tail有 2+ 个元素,则不会工作。 -
但是这段代码可以编译。你的编译器是怎么说的?