gpt4 book ai didi

c++ - 模板的编译时类型别名

转载 作者:行者123 更新时间:2023-11-28 00:42:06 31 4
gpt4 key购买 nike

在我的碰撞/物理引擎中,我知道我在运行时使用的空间分区方法,这要归功于模板。我正在尝试创建一个通用的 Query 类,它允许我对任何空间分区方法执行相同的查询。每种空间分区方法都实现了自己的查询版本,但接口(interface)是相同的。

问题是用户必须指定空间分区类型空间分区类型的查询类型,以及空间分区的查询方式分区类型

如果用户要更改其空间分区方法,所有现有代码都会中断。

有没有办法让用户只指定空间划分类型、一个通用的查询类型和一个通用的查询模式并具有某种别名以便自动选择正确的类型(相对于空间分区类型)?

我已经尝试使用 (C++11 typedef) 和decltype 以及部分特化,但我找不到编写代码的正确方法,但我从来没有让它编译/工作。

我只能考虑使用 virtual 方法和一个基类——但这似乎没有必要,因为我在编译时“知道”这些类型。


当前代码:

 // Query.h
template<class T, class U, class V>
Query<T, U, V> getQuery() { return Query<T, U, V>(getSpatial<T>()); }

// Example.cpp (user project)
getQuery<Grid, GridQueryType::Point, GridQueryMode::All>();
getQuery<QuadTree, QuadTreeQueryType::Point, QuadTreeQueryMode::All>();

所需代码(无效):

 // Query.h
namespace Type { struct Point; }
namespace Mode { struct All; }
template<class T, class U, class V>
Query<T, typename T::U, typename T::V> getQuery()
{
return Query<T, typename T::U, typename T::V>(getSpatial<T>());
}

// Grid.h
using Type::Point = GridQueryType::Point;
using Mode::All = GridQueryMode::All;

// QuadTree.h
using Type::Point = QuadTreeQueryType::Point;
using Mode::All = QuadTreeQueryMode::All;

// Example.cpp (user project)
getQuery<Grid, Type::Point, Mode::All>(); // actually uses GridQueryType::Point and GridQueryMode::All!
getQuery<QuadTree, Type::Point, Mode::All>(); // actually uses QuadTreeQueryType::Point and QuadTreeQueryMode::All!

真实代码还传递 typename... TArgs 以允许特定于查询类型的参数 - 由于篇幅原因,我将其从示例中排除。

最佳答案

如果您的第一个模板参数与第二个和第三个模板参数之间存在直接关系,那么后者似乎不应被视为模板参数,而应从类型映射中确定:

template <typename> struct TypePoint;
template <typename> struct ModeAll

template <> struct TypePoint<Grid> { typedef GridQueryType::Point type; };
template <> struct ModeAll<Grid> { typedef GridQueryMode::All type; };

getQuery<Grid>();

至少,使用上面的类型映射,您可以为参数定义默认值。如果要遵循其他参数,您基本上可以将前三个参数与它们的默认值一起分组到一个类型中,该类型将被传递,例如:

template <typename T,
typename P = typename TypePoint<T>::type,
typename M = typename ModeAll<T>::type>
struct QueryParameters {
typedef T type;
typedef P point_type;
typedef M mode_type;
};
getQuery<QueryParemeters<Grid>, Other, Paremters>();

关于c++ - 模板的编译时类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18354446/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com