2017-01-30 143 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。 –