匹配模板模板类型参数

match against template template type parameter

假设我想将任何容器与特定成员(约束)进行类型匹配 - 但还将类型变量绑定到容器和成员。例如让TU是对应于class和成员Someclass.member的模板类型变量。这可能吗?

让我们通过模板化容器来简化事情。这会将成员类型作为允许删除约束的模板类型参数移动到类型系统中。现在我可以将类型变量绑定到模板类型和模板类型参数吗?例如,让 TU 是对应于模板化容器 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);
}

Demo

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 时混淆编译器。