假设我有一个这样的简单模板:
template<typename T>
class A {};
Run Code Online (Sandbox Code Playgroud)
我想指定type-parameter T属于某种不相关的类型X<U>,其中U不知道(或不可指定).
有没有办法如何表达这个概念?
sky*_*ack 30
有没有办法如何表达这个概念?
你不需要一个概念,类模板专业化在你的情况下工作得很好.
例如,您可以这样做:
template<typename T>
class A;
template<typename U>
class A<X<U>> { /* ... */ };
Run Code Online (Sandbox Code Playgroud)
这样,除非A使用表单类型X<U>(其中U未知)进行实例化,否则您将收到编译时错误,因为未定义主模板.换句话说,它不适用于所有类型,但X<U>(对于每个类型U),后者匹配具有适当定义的类模板特化.
请注意,我假设X是一种已知类型.你的问题并不清楚.
无论如何,如果它不是,你想接受各类形式的X<U>每个X和每一个U,你仍然可以这样做:
template<typename T>
class A;
template<template<typename> class X, typename U>
class A<X<U>> { /* ... */ };
Run Code Online (Sandbox Code Playgroud)
作为一个最小的工作示例:
template<typename>
struct S {};
template<typename>
class A;
template<typename U>
class A<S<U>> {};
int main() {
A<S<int>> aSInt;
A<S<double>> aSDouble;
// A<char> aChar;
}
Run Code Online (Sandbox Code Playgroud)
这两个A<S<int>>和A<S<double>>的罚款和示例编译.如果您切换注释,它将不再编译,因为A<char>根本没有定义.
作为旁注,如果您不想使用类模板专业化并且您想要模拟概念(请记住它们不是标准的一部分,并且它们至少要到2020年),您可以做类似的事情.这个:
#include<type_traits>
template<typename>
struct X {};
template<typename>
struct is_xu: std::false_type {};
template<typename U>
struct is_xu<X<U>>: std::true_type {};
template<typename T>
struct A {
static_assert(is_xu<T>::value, "!");
// ...
};
int main() {
A<X<int>> aXInt;
A<X<double>> aXDouble;
// A<char> aChar;
}
Run Code Online (Sandbox Code Playgroud)
也就是说,给定泛型类型T,静态通过另一个结构(is_xu在示例中)断言其实际类型,该结构验证是否T具有X<U>(对于每个U)形式.
我的两分钱:课程模板专业化更容易阅读和理解一目了然.
Pio*_*cki 11
template <typename T, template <typename> class C>
concept bool Template = requires (T t) { {t} -> C<auto>; };
Run Code Online (Sandbox Code Playgroud)
现在给出一个类模板:
template <typename T>
struct X {};
Run Code Online (Sandbox Code Playgroud)
可以使用以下方法约束类型模板参数:
template <typename T> requires Template<T, X>
class A {};
Run Code Online (Sandbox Code Playgroud)
要么:
template <Template<X> T>
class A {};
Run Code Online (Sandbox Code Playgroud)
这也适用于派生自的类型X<U>.
| 归档时间: |
|
| 查看次数: |
2708 次 |
| 最近记录: |