如果約束為假,我們是否可以有一個別名模板指向一個型別,或者如果該約束為真,則指向另一個型別?
template < class T >
using MyType = SomeType;
template < class T >
requires SomeConstraint
using MyType = SomeOtherType;
我知道這樣做不會編譯,但有解決方法嗎?因為我想在一個類中設定一些型別,void如果不遵守約束,或者如果遵守約束,則設定為其他型別,而不必讓整個類都需要該約束
uj5u.com熱心網友回復:
是的,或者通過將別名移動到一個類中并部分專門化該類(然后從外部對類中的別名進行別名),或者對于您顯示更簡單的情況:
template<typename T>
using MyType = std::conditional_t<requires{ requires SomeConstraint; },
SomeOtherType, SomeType>;
取決于是什么SomeConstraint(我假設它是比識別符號更復雜的東西的占位符)可能也只是
template<typename T>
using MyType = std::conditional_t<SomeConstraint,
SomeOtherType, SomeType>;
會沒事的。
然而,無論哪種情況,這都需要SomeOtherType和SomeType都是有效型別(再次假設它們是占位符)。它不會對他們應用 SFINAE。如果沒有給出,您需要回退到類部分專業化方法。
類模板偏特化方法:
template<typename T>
struct MyTypeImpl {
using type = SomeType;
};
template<typename T>
requires SomeConstraint
struct MyTypeImpl<T> {
using type = SomeOtherType;
};
template<typename T>
using MyType = typename MyTypeImpl<T>::type;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515131.html
標籤:C 模板约束c -概念
