从专业化访问模板参数

tml*_*len 2 c++ c++11 c++14

template<typename T, typename U>
struct A;

template<std::size_t I>
struct A<int, char[I]> {
    using pointer = T*; // does not compile
};

int main() {
    A<int, char[3]> a;    
}
Run Code Online (Sandbox Code Playgroud)

有没有办法从类模板特化中访问类型T(= int)A<int, char[I]>,而没有显式写出特化中的类型?

Yak*_*ont 7

像这样的东西:

template<class T, class U, class=T, class=U>
struct A;

template<std::size_t I, class T, class U>
struct A<int, char[I], T, U> {
  using pointer = T*;
};
Run Code Online (Sandbox Code Playgroud)

作品.如果某人实际传递了第二种类型T并且U问题在发展,但......

另一种方法是:

template<class T, class U>
struct A;

// get args from an instance!
template<class A>
struct A_Args;
template<class T_, class U_>
struct A_Args<A<T_,U_>> {
  using T = T_; using U = U_;
};
template<class A>
using A_T = typename A_Args<A>::T;
template<class A>
using A_U = typename A_Args<A>::U;

// reflect on our troubles:
template<std::size_t I>
struct A<int, char[I]> {
  using pointer = A_T<A>*;
};
Run Code Online (Sandbox Code Playgroud)

我们有一个using别名,从A我们在专业化中使用的泛型中提取args .

这个版本可以通过如下界面制作通用:

template<std::size_t I, class Instance>
struct nth_template_arg;
template<std::size_t I, class Instance>
using nth_template_arg_t=typename nth_template_arg<I, Instance>::type;
Run Code Online (Sandbox Code Playgroud)

注意它只适用于只接受类型参数的模板.(实现留作练习.我可能会使用tuple_element第一遍;使用元组有缺点,它们是重型,而重型的元编程会吮吸性能,有时会导致其他问题.)