我刚刚开始学习模板元编程,并且试图了解它的局限性。
以下面的triangle_t
类为例:
struct triangle_t
{
triangle_t() { }
triangle_t(vec3_t v0, vec3_t v1, vec3_t v2) : v0(v0), v1(v1), v2(v2) { }
vec3_t v0;
vec3_t v1;
vec3_t v2;
vec3_t normal();
};
现在,三角形可以是 2 维和 3 维的,所以也许我想让它成为一个模板类,如下所示:
namespace detail
{
template<typename T>
struct triangle_t
{
triangle_t() { }
triangle_t(T v0, T v1, T v2) : v0(v0), v1(v1), v2(v2) { }
T v0;
T v1;
T v2;
T normal();
};
};
typedef detail::triangle_t<vec2_t> triangle2_t;
typedef detail::triangle_t<vec3_t> triangle3_t;
到目前为止,一切都很好,很漂亮,除了一个问题。二维三角形没有法线。所以我想要做的是,通过模板元编程,省略结构的normal()
函数triangle2_t
。
我试图执行以下实现:
template<typename U = T>
typename std::enable_if<std::is_same<U, vec3_t>::value, U>::type normal() const
{
return glm::cross((v1 - v0), (v2 - v0));
}
我收到了这个错误:
错误 C4519:默认模板参数只允许在类模板上使用
我正在尝试做的事情可能吗?如果没有,是否有任何类似的方法可以提供相同的结果?