簡體   English   中英

C++ class 模板 - 特定實例的構造函數

[英]C++ class template - constructor for a specific instance

是否可以為模板化 class 的特定實例指定額外的構造函數?

請看下面的例子。

#include <immintrin.h>

class float4 {
private:
    __m128 _data;
public:
    explicit float4(const float& val = 0.0f)
        : _data(_mm_set1_ps(val)) {}
    ~float4(void) = default;
};

template<typename DATATYPE>
class Vec3 {
private:
    DATATYPE _data[3];
public:
    explicit Vec3(const DATATYPE& x, const DATATYPE& y, const DATATYPE& z)
        : _data{ x, y, z } {}

    // This wouldn't work because such a constructor is already defined for DATATYPE=float.
    // What I want is to have such a constructor for DATATYPE=float4.
    //explicit Vec3(const float& x, const float& y, const float& z)
    //  : _data{ DATATYPE(x), DATATYPE(y), DATATYPE(z) } {}

    ~Vec3(void) = default;
};

template class Vec3<float>;
template class Vec3<float4>;

typedef Vec3<float>  Vec3f;
typedef Vec3<float4> Vec3f_simd;

int main(int argc, char** argv) {
    const Vec3f      a(1.0f, 2.0f, 3.0f);
    const Vec3f_simd b(float4(1.0f), float4(2.0f), float4(3.0f)); // OK

    //const Vec3f_simd c(1.0f, 2.0f, 3.0f); // Not OK
}

所以我們有兩個“基本”類型 - floatfloat4 我想要一個 class 模板Vec3用於這兩種基本類型。 到目前為止還好。 我還想要的是Vec3<float4>中的一個構造函數,它只接受xyz作為浮點數,然后將float4(x)float4(y)float4(z)構造到Vec3<float4>::_data 問題是生成的Vec3<float>不會編譯,因為兩個構造函數會重合。

是的,使用requires

explicit Vec3(...) requires std::same_as<DATATYPE, float4>
//                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在 C++20 之前,您必須使構造函數成為添加 SFINAE 的模板:

template <typename T = DATATYPE, std::enable_if_t<std::is_same_v<T, float4>, std::nullptr_t> = nullptr>
explicit Vec3(...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM