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;
}
有没有办法从类模板特化T
中访问类型int
(= A<int, char[I]>
),而没有明确写出特化中的类型?
答案 0 :(得分: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*;
};
的工作原理。如果有人实际传递了第二个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>*;
};
我们有一个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;
注意它只适用于只接受类型参数的模板。 (实现留作练习。我可能会使用tuple_element
作为第一遍;使用元组有缺点,它们是重型,而重型的元编程会吮吸性能,有时会导致其他问题。)< / p>
答案 1 :(得分:-1)
简单地说,
#include <type_traits>
template<class T, class U>
struct foo;
template<class T, std::size_t Index>
struct foo<T, char[Index]>
{
using type = T;
};
int
main()
{
static_assert(std::is_same<foo<int, char[3]>::type, int>::value, "");
}
答案 2 :(得分:-2)
你可以试试这个:
template<typename T, typename U, std::size_t I>
struct A{
using pointer = T*;
};