代码抄自pybind11.
#include <iostream>
#include <type_traits>
#include <tuple>
/// Helper template to strip away type modifiers
template <typename T>
struct intrinsic_type {
using type = T;
};
template <typename T>
struct intrinsic_type<const T> {
using type = typename intrinsic_type<T>::type;
};
template <typename T>
struct intrinsic_type<T *> {
using type = typename intrinsic_type<T>::type;
};
template <typename T>
struct intrinsic_type<T &> {
using type = typename intrinsic_type<T>::type;
};
template <typename T>
struct intrinsic_type<T &&> {
using type = typename intrinsic_type<T>::type;
};
template <typename T, size_t N>
struct intrinsic_type<const T[N]> {
using type = typename intrinsic_type<T>::type;
};
template <typename T, size_t N>
struct intrinsic_type<T[N]> {
using type = typename intrinsic_type<T>::type;
};
template <typename T>
using intrinsic_t = typename intrinsic_type<T>::type;
template <typename T>
class type_caster{
public:
bool load(){
return true;
}
};
template <typename type>
using make_caster = type_caster<intrinsic_t<type>>;
template <size_t...>
struct index_sequence {};
template <size_t N, size_t... S>
struct make_index_sequence_impl : make_index_sequence_impl<N - 1, N - 1, S...> {};
template <size_t... S>
struct make_index_sequence_impl<0, S...> {
using type = index_sequence<S...>;
};
template <size_t N>
using make_index_sequence = typename make_index_sequence_impl<N>::type;
template <typename ...Args>
class argument_loader{
public:
using indices = make_index_sequence<sizeof...(Args)>;
void print(){
print_info(indices{});
}
private:
template <size_t... Is>
void print_info(index_sequence<Is...>){
std::cout<<sizeof...(Is)<<std::endl;
int i=0;
for(bool r:{std::get<Is>(args).load()...}){
std::cout<<r<<" "<<i<<std::endl;
i++;
}
}
std::tuple<make_caster<Args>...> args;
};
int main() {
argument_loader<int,float,double> me;
me.print();
return 0;
}
解释两个模板的用法,第一处
std::tuple<make_caster<Args>...> args;
按照main中传入的参数,这句代码会被编译器处理为:
std::tuple<make_caster<int>,make_caster<float>,make_caster<double>> args;
第二处:
for(bool r:{std::get<Is>(args).load()...})
编译器处理后,{}中内容是由函数返回值组成的序列。
[1]c++里,如何把模版函数放入数组中?
网友评论