イマイチやりたいことがわからんけどこんなかんじ?
cpp
1#include <sprout/type/type_tuple.hpp>
2#include <tuple>
3template<typename T,size_t N>
4struct Boo{};
5namespace traits {
6template<typename T>
7struct boo;
8template<typename T, size_t N>
9struct boo<Boo<T, N>> : std::integral_constant<std::size_t, N>
10{
11 using type = T;
12};
13}
14template<typename ...Args>
15auto func(const Args...){
16 using T = sprout::types::type_tuple<typename traits::boo<Args>::type...>;
17 //static_assert(std::is_same_v<sprout::types::type_tuple<int, int>, T>);
18 [[maybe_unused]] constexpr auto N = std::tuple{traits::boo<Args>::value...};
19}
20
21int main(){
22 Boo<int,1> a;
23 Boo<int,1> b;
24 func(a,b);
25}
https://wandbox.org/permlink/ExZ15cwohvOeLLnX
func
の中のN
がsize_t
というのは何を言ってるのか理解できなかったのでtupleにしときました。
追記
std::common_type
を使おうとしているということは、完全に同一ではない型でも許容したいということだと思います。するとArgs
を直接std::common_type
にいれるのはまずくて、要素型を取り出してそれに対して適用しなければならないと思います。
C++20で追加されたconceptとC++17で追加されたfold式を組み合わせるとこんなふうに書けるかと思います。
cpp
1#include <cstddef>
2#include <type_traits>
3template<typename T,size_t N>
4struct Boo{};
5namespace traits {
6 template<typename> struct boo;
7 template<typename T, size_t N>
8 struct boo<Boo<T, N>> : std::integral_constant<std::size_t, N>
9 {
10 using type = T;
11 };
12 template<typename T> using boo_elem_t = typename boo<T>::type;
13
14 template<typename ...Args>
15 concept calculatable_boos = requires (Args ...args) {
16 requires sizeof...(Args) >= 2;
17 typename std::common_type<boo_elem_t<Args>...>::type;
18 { ( boo<Args>::value == ... ) };
19 };
20}
21template<typename ...Args>
22auto func(const Args...)
23requires traits::calculatable_boos<Args...>
24{
25
26}
27
28int main(){
29 Boo<int,1> a;
30 Boo<int,1> b;
31 Boo<short,1> c;
32 func(a,b);
33 func(a,c);
34}
https://wandbox.org/permlink/mDXg3XmIvcB6ybdF
ref:
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/19 11:57
2021/03/19 12:21
2021/03/19 12:22
2021/03/19 12:47
2021/03/19 14:15 編集
2021/03/20 01:22
2021/03/20 10:11
2021/03/20 12:43