Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cassert>
- #include <type_traits>
- #include <iostream>
- template <typename T, typename... Args>
- struct is_one_of;
- template <typename T>
- struct is_one_of<T> {
- static constexpr bool result = false;
- };
- template <typename T, typename... Args>
- struct is_one_of<T, T, Args...> {
- static constexpr bool result = true;
- };
- template <typename T, typename K, typename... Args>
- struct is_one_of<T, K, Args...> {
- static constexpr bool result = is_one_of<T, Args...>::result;
- };
- template <typename... List> struct type_list {
- };
- template <typename T, typename TypeList>
- struct is_one_of_type_list;
- template <typename T, typename... Args>
- struct is_one_of_type_list<T, type_list<Args...>> {
- static constexpr bool result = is_one_of<T, Args...>::result;
- };
- template <typename T>
- struct message
- {
- T payload;
- };
- struct payload_ll_1{};
- struct payload_ll_2{};
- using ll_payload_list = type_list< payload_ll_1, payload_ll_2 >;
- struct payload_ss_1{};
- struct payload_ss_2{};
- using ss_payload_list = type_list < payload_ss_1, payload_ss_2 >;
- template <typename T>
- void f( const message<T>& msg,
- typename std::enable_if<is_one_of_type_list<T, ll_payload_list>::result>::type* = 0) {
- std::cout << "I'm LL payload" << std::endl;
- }
- template <typename T>
- void f( const message<T>& msg,
- typename std::enable_if<is_one_of_type_list<T, ss_payload_list>::result>::type* = 0) {
- std::cout << "I'm SS payload" << std::endl;
- }
- int main() {
- assert(is_one_of<int>::result == false);
- assert((is_one_of<int, int>::result == true));
- assert((is_one_of<int, int, char, double>::result == true));
- assert((is_one_of<int, char, int, double>::result == true));
- assert((is_one_of<int, char, double>::result == false));
- using MyTypeList = type_list<int, char, double>;
- assert((is_one_of_type_list<int, MyTypeList>::result == true));
- assert((is_one_of_type_list<float, MyTypeList>::result == false));
- message<payload_ll_1> ll_msg;
- f( ll_msg );
- message<payload_ss_1> ss_msg;
- f( ss_msg );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement