-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsum_all.cpp
More file actions
28 lines (22 loc) · 732 Bytes
/
Copy pathsum_all.cpp
File metadata and controls
28 lines (22 loc) · 732 Bytes
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
#include <type_traits>
#include <utility>
#include <iostream>
template <typename T, typename ... Ts>
constexpr inline bool are_same_v = std::conjunction_v<std::is_same<T, Ts>...>;
template <typename T, typename ... Ts>
struct first_arg { using type = T; };
template <typename ... Ts>
using first_arg_t = typename first_arg<Ts...>::type;
template <typename ... Ts>
concept Addable = requires(Ts&&... args) {
{ (... + std::forward<Ts>(args)) } -> std::same_as<first_arg_t<Ts...>>;
requires are_same_v<Ts...>;
requires sizeof...(Ts) > 1;
};
template <typename ... Ts>
auto sum_all(Ts&& ... args) requires Addable<Ts...> {
return (... + std::forward<Ts>(args));
}
int main() {
std::cout << sum_all(1, 2, 3);
}