匹配模板模板类型参数
match against template template type parameter
假设我想将任何容器与特定成员(约束)进行类型匹配 - 但还将类型变量绑定到容器和成员。例如让T
和U
是对应于class和成员Someclass.member
的模板类型变量。这可能吗?
让我们通过模板化容器来简化事情。这会将成员类型作为允许删除约束的模板类型参数移动到类型系统中。现在我可以将类型变量绑定到模板类型和模板类型参数吗?例如,让 T
和 U
是对应于模板化容器 T<U>
的模板类型变量。这可能吗?
例如,
template <typename T>
struct S1 {
T a;
int b;
};
struct S2 {
S1<int> a;
S1<double> b;
};
void cb(auto*);
// Many things have been tried
template<T<U>>
template<template<typename U> typename T>
void caller(T<U>*, void (*)(U*));
template<S1<T>>
void caller(S1<T>*, void (*)(T*));
template<T>
void caller<S1<T>>(S1<T>*, void (*)(T*));
caller
的模板列表应该是
template <typename T>
struct S1 {
T a;
int b;
};
void cb(auto*);
template<template<typename...> typename Temp, typename U>
void caller(Temp<U>*, void (*)(U*));
int main() {
S1<int> a;
caller(&a, cb);
S1<double> b;
caller(&b, cb);
}
I want to pass an S1
pointer s1
and cb
to caller such that the type of cb
is inferred from the type of s1->a
像这样?
#include <iostream>
#include <type_traits>
template <typename T>
struct S1 {
T a;
int b;
};
template <typename T>
void caller(S1<T> *, void (*)(std::type_identity_t<T> *)) {}
int main()
{
S1<int> s1;
caller(&s1, [](int *){});
}
这里需要 type_identity_t
来阻止从第二个参数推导出 T
,这会在传递 lambda 时混淆编译器。
假设我想将任何容器与特定成员(约束)进行类型匹配 - 但还将类型变量绑定到容器和成员。例如让T
和U
是对应于class和成员Someclass.member
的模板类型变量。这可能吗?
让我们通过模板化容器来简化事情。这会将成员类型作为允许删除约束的模板类型参数移动到类型系统中。现在我可以将类型变量绑定到模板类型和模板类型参数吗?例如,让 T
和 U
是对应于模板化容器 T<U>
的模板类型变量。这可能吗?
例如,
template <typename T>
struct S1 {
T a;
int b;
};
struct S2 {
S1<int> a;
S1<double> b;
};
void cb(auto*);
// Many things have been tried
template<T<U>>
template<template<typename U> typename T>
void caller(T<U>*, void (*)(U*));
template<S1<T>>
void caller(S1<T>*, void (*)(T*));
template<T>
void caller<S1<T>>(S1<T>*, void (*)(T*));
caller
的模板列表应该是
template <typename T>
struct S1 {
T a;
int b;
};
void cb(auto*);
template<template<typename...> typename Temp, typename U>
void caller(Temp<U>*, void (*)(U*));
int main() {
S1<int> a;
caller(&a, cb);
S1<double> b;
caller(&b, cb);
}
I want to pass an
S1
pointers1
andcb
to caller such that the type ofcb
is inferred from the type ofs1->a
像这样?
#include <iostream>
#include <type_traits>
template <typename T>
struct S1 {
T a;
int b;
};
template <typename T>
void caller(S1<T> *, void (*)(std::type_identity_t<T> *)) {}
int main()
{
S1<int> s1;
caller(&s1, [](int *){});
}
这里需要 type_identity_t
来阻止从第二个参数推导出 T
,这会在传递 lambda 时混淆编译器。