使用模板元编程的函数省略
Function omission using template meta-programming?
我刚刚开始学习模板元编程,我正在努力理解它的局限性。
以以下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;
到目前为止一切都很好,除了一个问题。二维三角形没有法线。因此,我想通过模板元编程的方式,省略triangle2_t
结构的normal()
函数。
我尝试执行以下实现:
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:默认模板参数只允许在类上使用模板
我想做的事情可能吗?如果没有,是否有类似的方法可以产生相同的结果?
使normal
成为非成员函数。
template<typename T>
typename std::enable_if<std::is_same<T, vec3_t>::value, T>::type normal(triangle_t<T> const& t)
{
return glm::cross((t.v1 - t.v0), (t.v2 - t.v0));
}
或者更好(不需要tmp)
vec3_t normal(triangle_t<vec3_t> const& t)
{
return glm::cross((t.v1 - t.v0), (t.v2 - t.v0));
}
我可能会这么做:
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;
};
template<typename T>
struct triangle_with_normal_t : triangle_t<T>
{
// constructors here
T normal();
};
};
typedef detail::triangle_t<vec2_t> triangle2_t;
typedef detail::triangle_with_normal_t<vec3_t> triangle3_t;
但这不一定是TMP。
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- C++使用模板元编程生成函数
- 在C++中编程,将 3 个数字发送到一个函数,然后计算这 3 个数字的平均函数
- 如何使用模板元编程在自由函数C++链接两个不相关的类
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 以编程方式在 C++ 中创建函数
- 函数模板编程而不是继承
- C++函数式编程.实施 f(a)(b)(c)
- C :对输入验证函数进行编程的性能影响可以对其进行编程,而每次都可以将其编程
- 有没有办法在函数以编程方式返回的引用上多次调用函数? -元组动态访问
- 使用phpMyAdmin+销售函数用C++编程
- 全局析构函数在C/C++编程中是必要的吗
- C++函数式编程代码片段
- C++宏中的函数式编程风格:这是否记录在任何地方
- 如何使用 C++11 中的函数式编程从映射中获取密钥
- 使用C++中的参数包进行函数式编程
- 调用第二个*函数时编程软锁定
- C/ c++中的函数式编程
- 用于在堆上生成对象的函数式编程技术
- 函数式编程-当调用不带参数的C++函数时,括号的重要性