简单的概念检查

wim*_*aan 24 c++ c++-concepts

假设我有一个这样的简单模板:

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)

DEMO

这也适用于派生自的类型X<U>.

  • @skypjack如果你对概念感兴趣,这里有一个我习惯学习使用的源代码列表:[http://en.cppreference.com/w/cpp/language/constraints],Strousturp指南[http:/ /www.stroustrup.com/good_concepts.pdf]和规范性论文(阅读它清除了我的一些误解!)[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016 /n4630.pdf] (2认同)
  • @dyp gcc在模板参数中实现了这种自动类型推导,它令人惊讶地工作......似乎auto是一个非常特殊的概念,可以根据上下文允许类型或值... (2认同)