Variadic Template(五)

 

如果最后一个元素的处理方式不同于前面的,可以使用以下递归调用

 

#include<iostream>
#include<tuple>
#include<bitset>

using namespace std;

template <int IDX, int MAX, typename... Args>
struct SELF_PRINT_TUPLE
{
    static void print(ostream& os, const tuple<Args...>& t) {
        os << get<IDX>(t) << (IDX+1 == MAX?"":",");
        SELF_PRINT_TUPLE<IDX+1, MAX, Args...>::print(os, t);
    }
};

template<int MAX, typename... Args>
struct SELF_PRINT_TUPLE<MAX, MAX, Args...>
{
    static void print(std::ostream& os, const tuple<Args...>& t){}
};



template <typename...Args>
ostream& operator<< (ostream& os, const tuple<Args...>& t)
{
    os << "[";
    SELF_PRINT_TUPLE<0, sizeof...(Args),Args...>::print(os, t);
    return os << "]";
}

int main()
{
    cout << make_tuple(7.5, string("hello"), bitset<16>(377), 42);
    return 0;
}

 

需要注意的是,全特化的函数实现位置需要放到偏特化的代码实现的上方,否则就会报结构体的重复定义错误

posted @ 2022-02-13 12:38  王清河  阅读(37)  评论(0编辑  收藏  举报