C ++ Concepts TS:需要嵌套的模板化类型别名

时间:2017-10-29 22:12:41

标签: c++ templates traits c++-concepts

对于通用库,我试图根据traits结构的正确实现来定义一个概念。特别是我想检查用户是否提供了所有必需的嵌套类型,静态成员函数和数据成员。但是,我找不到一种方法来要求嵌套的模板化类型(-alias)。

我有一个traits struct

的声明
template <typename>
struct trait;

char s

的专业化
template <>
struct trait<char> {
    template <typename>
    using type = int;
};

我现在用这个特性定义我的概念

template <typename T>
concept bool SatisfiesTrait = requires() {
    typename trait<T>;                  // require the user to have spcialized 
                                        // for their type

    typename trait<T>::type<long long>; // require the nested template
};

以及需要满足此概念的类型的函数

constexpr bool foo(SatisfiesTrait) { return true; }

在我的main方法中,我尝试使用char调用此函数:

int main() {
    foo('c');
}

使用GCC编译所有这些时,我收到错误消息

prog.cc:15:24: error: 'trait<T>::type' is not a type
     typename trait<T>::type<long long>;
                        ^~~~
prog.cc: In function 'int main()':
prog.cc:26:11: error: cannot call function 'constexpr bool foo(auto:1) [with auto:1 = char]'
    foo('c');
           ^
prog.cc:18:16: note:   constraints not satisfied
 constexpr bool foo(SatisfiesTrait) {
                ^~~
prog.cc:18:16: note: in the expansion of concept 'SatisfiesTrait<auto:1>' template<class T> concept const bool SatisfiesTrait<T> [with T = char]

但是,当我将main功能更改为

int main() {
    typename trait<char>::type<long long> v;
    (void) v;

    foo('c'); 
}

并注释掉它编译的嵌套别名模板的要求。当嵌套类型具有非类型模板参数而不是类型参数时,会出现同样的问题。

我在这里做错了什么,或者这是GCC实施Concepts TS的错误?

代码也可以在Wandbox上找到。

0 个答案:

没有答案