[英]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
}
所以我們有兩個“基本”類型 - float
和float4
。 我想要一個 class 模板Vec3
用於這兩種基本類型。 到目前為止還好。 我還想要的是Vec3<float4>
中的一個構造函數,它只接受x
、 y
和z
作為浮點數,然后將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.