我有一个类似的问题,就像在这里发现的那样,但是可能我仍然在做一些不同的事情,因此我将一无所获。
有些类型将使用标记结构进行标记:
template<typename Geometry=void, typename Enable = void>
struct tag
{
typedef void type;
};
并介绍了点和三角形标记:
struct point_tag {};
struct triangle_tag {};
使用构造点类型std::vector
:
template<>
struct tag<std::vector<double>>
{
typedef point_tag type;
};
和三角形类型作为的别名模板std::array
:
template<typename Point>
using triangle =
typename std::enable_if
<
std::is_base_of<typename tag<Point>::type, point_tag>::value,
std::array<Point,3>
>::type;
如果作为传递的论点,即启用Point
参数真标记point_tag
,
事后,我想标记所有的三角形与triangle_tag
这样的:
template <typename Point>
struct tag<triangle<Point>>
{
typedef triangle_tag type;
};
由于std::array
别名和继承会导致初始化程序列表构造出现问题,因此该别名是别名,而不是合成/继承。但是,编译失败并显示错误
g++ -std=c++1y main.cpp -o main
main.cpp:31:8: error: template parameters not deducible in partial specialization:
struct tag<triangle<Point>>
^
main.cpp:31:8: note: ‘Point’
如果我不依赖于triangle
基于Point
被标记的参数来启用,而是对所有这样的类型都这样做:
template<typename Point>
using triangle =
// This works, but there is no restriction on Point to be tagged with point_tag.
std::array<Point, 3>;
然后编译正常。但是,三角形也是一个三角形,我正在基于类型的任意属性使用函数重载,以从enable_if
失败的那些函数中减少函数模板集。我不依赖于容器接口来确定函数模板,因为有时隐式接口是完全相同的,但操作语义不同。例如,三角形是闭合的圆形线段(涉及3个边的操作),而点链是开放式线段(涉及2个边的操作)。所有操作都需要直接访问运算符,这是对模板参数的唯一要求,当enable_if
无限制地实现它们时,会导致函数模板实例化的模棱两可-所有这些都在链接的文章中进行了介绍。
这是完整的示例。
有什么我想念的吗?如何解决这个问题?
什么不使用您的Enable
template参数?
就像是:
template <typename Point>
struct tag<
std::array<Point, 3>,
typename std::enable_if<
std::is_base_of<
typename tag<Point>::type,
point_tag
>::value
>::type
>
{
typedef triangle_tag type;
};
(好吧,您重复enable_if
...)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句