我有一個矢量包裝器的 100% 作業代碼,它為各種型別的矢量調整大小不同。但是,在定義 std::enable_if_t 時,我使用
template <typename C = Vec>
而不是直接使用“Vec”。有沒有辦法為 resizeListTo() 方法重用類的模板引數“Vec”?
完整代碼:
template <class Vec>
class MyVectorWrapeer<Vec> {
private:
template <typename C = Vec>
std::enable_if_t<someCondition<C, typename C::value_type>, void>
static inline resizeListTo(C& c, uint32_t size) { /*Some Code*/ }
template <typename C = Vec>
std::enable_if_t<!someCondition<C, typename C::value_type>, void>
static inline resizeListTo(C& c, uint32_t size) { /*Different Code*/ }
public:
static void deserializeVector(Vec* dst) {
...
resizeListTo(*dst, size);
...
}
我的意思是,像
template <>
std::enable_if_t<someCondition<Vec, typename Vec::value_type>, void>
static inline resizeListTo(Vec& c, uint32_t size) {
(上面的代碼顯然不能編譯)
uj5u.com熱心網友回復:
在 C 20 中,您必須requires為方法添加約束:
template <class Vec>
class MyVectorWrapeer<Vec>
{
private:
static void resizeListTo(Vec& c, uint32_t size) requires(someCondition<Vec>)
{ /*Some Code*/ }
static void resizeListTo(Vec& c, uint32_t size) requires(!someCondition<Vec>)
{ /*Different Code*/ }
};
從您的示例中,您需要不同的實作,因此標記調度:
template <class Vec>
class MyVectorWrapeer<Vec>
{
private:
static void resizeListTo_impl(Vec& c, uint32_t size, std::true_type) { /*Some Code*/ }
static void resizeListTo_impl(Vec& c, uint32_t size, std::false_type) { /*Different Code*/ }
static void resizeListTo(Vec& c, uint32_t size)
{
resizeListTo_impl(c, size, std::bool_constant<someCondition<Vec>>{});
}
};
或者從 C 17 開始,if constexpr(如果兩個分支都是可編譯的,那么常規if甚至可以在 c 17 之前完成這項作業):
template <class Vec>
class MyVectorWrapeer<Vec>
{
private:
static void resizeListTo(Vec& c, uint32_t size)
{
if constexpr (someCondition<Vec>) {
/*Some Code*/
} else {
/*Different Code*/
}
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/508179.html
下一篇:為概念呼叫非默認建構式
