2017-01-30 142 views
3

我正在写一个概念,要求类有一个ValueType类型别名,并且有一个静态函数Check,其中需要ValueType并返回void嵌套类型的类的概念

这是我到目前为止有:

template <typename T> 
concept bool Predicate() 
{ 
    return requires(T object) 
    { 
     typename T::ValueType; 
     requires (T::ValueType value) 
     { 
      {T::Check(value)} -> void; 
     }; 
    }; 
} 

这不,下面的错误编译:error: expected ')' before 'value'

+0

啊... C++ 20 ...好... – rustyx

+0

'需要requires'和'typename'将简约的修复。 –

回答

4

这里有一个解决方案,我发现,其中包括在分裂两种Predicate不同的概念:

template <typename T> 
concept bool HasCheck() 
{ 
    return requires (typename T::ValueType value) 
    { 
     {T::Check(value)} -> void; 
    }; 
}; 

template <typename T> 
concept bool Predicate() 
{ 
    return requires(T object) 
    { 
     typename T::ValueType; 
     requires HasCheck<T>(); 
    }; 
} 

wandbox example


或者,你可以用&&requires条款:

template <typename T> 
concept bool Predicate() 
{ 
    return requires(T object) 
    { 
     typename T::ValueType;   
    } 
    && requires (typename T::ValueType value) 
    { 
     {T::Check(value)} -> void; 
    }; 
} 

wandbox example

+0

谢谢,我也发现我不需要'T object'部分。 – Lyberta

3

你过compicating问题:

template <typename T> 
concept bool Predicate = requires(typename T::ValueType obj) { 
    { T::Check(obj) } -> void; 
}; 
+1

如果你想要这样的部分顺序,但你仍然需要一个'typename T :: ValueType;'在正文中,但+1。 –