假設我想對具有特定成員(約束)的任何容器進行型別匹配 - 但還將型別變數系結到容器和成員。例如 letT和U是對應于 class 和 member 的模板型別變數Someclass.member。這可能嗎?
讓我們通過模板化容器來簡化事情。這會將成員型別作為允許移除約束的模板型別引數移動到型別系統中。現在我可以將型別變數系結到模板型別和模板型別引數嗎?例如 letT和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*));
uj5u.com熱心網友回復:
的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);
}
演示
uj5u.com熱心網友回復:
我想將
S1指標傳遞給呼叫者,以便從s1型別推斷cbcbs1->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 時會混淆編譯器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/486497.html
