我正在撰寫一個模板類Foo<T>,我只想允許某些型別的T. 我已經玩了很長時間,現在類編譯了,但是在存在第二個模板非型別引數的情況下,我無法弄清楚如何正確實體化它。我怎樣才能給它一個默認值,以便我可以簡單地呼叫Foo<int>等等?
#include <iostream>
#include <utility>
#include <type_traits>
template<typename T>
struct is_foo_type {
using type = typename std::enable_if_t<
// std::is_same_v<T, vec2> ||
// std::is_same_v<T, vec3> ||
// std::is_same_v<T, vec4> ||
// std::is_same_v<T, ivec2> ||
// std::is_same_v<T, ivec3> ||
// std::is_same_v<T, ivec4> ||
// std::is_same_v<T, mat2> ||
// std::is_same_v<T, mat3> ||
// std::is_same_v<T, mat4> ||
// std::is_same_v<T, mat2x2> ||
// std::is_same_v<T, mat2x3> ||
// std::is_same_v<T, mat2x4> ||
// std::is_same_v<T, mat3x2> ||
// std::is_same_v<T, mat3x3> ||
// std::is_same_v<T, mat3x4> ||
// std::is_same_v<T, mat4x2> ||
// std::is_same_v<T, mat4x3> ||
// std::is_same_v<T, mat4x4> ||
std::is_same_v<T, int> ||
std::is_same_v<T, bool> ||
std::is_same_v<T, float> ||
std::is_same_v<T, char>
>;
};
template<typename T, typename is_foo_type<T>::type = 0>
class Foo {
public:
T _x;
Foo() = default;
Foo(const T& x) : _x(x) {};
void Increment(const T& x) { _x = x; }
};
int main() {
Foo<int> a{123}; // compiler error
// using foo_int = Foo<int>; // compiler error
// using foo_bool = Foo<bool>; // compiler error
// using foo_float = Foo<float>; // compiler error
// using foo_var = std::variant<foo_int, foo_bool, foo_float>;
// foo_var my_variant;
}
uj5u.com熱心網友回復:
std::enable_if_t<true>給你一個void型別。然后你試圖做類似的事情
template<typename T, void = 0>
由于明顯的原因,這不起作用。你可以用std::enable_if_t<..., int>.
但請注意,您在這里不是在做 SFINAE。在您的示例中,替換將是一個硬錯誤 - SFINAE 僅在直接背景關系中有效。
考慮以下替代實作:
template<typename T>
struct is_foo_type : std::disjunction<
std::is_same<T, int>,
std::is_same<T, bool>,
std::is_same<T, float>,
std::is_same<T, char>
> {};
template<typename T, typename = std::enable_if_t<is_foo_type<T>::value>>
class Foo { ... };
并注意使用的背景關系std::enable_if。
在這種特殊情況下,您還可以使用非型別模板引數
template<typename T, std::enable_if_t<is_foo_type<T>::value, int> = 0>
class Foo { ... };
當明確提供第二種型別時,避免“覆寫”替換的可能性,例如Foo<T, void>.
uj5u.com熱心網友回復:
嘗試添加多個模板
語法:template<typename T, typename V>.
并相應地使用它
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/428003.html
下一篇:模板引數中參考型別的相等性
