Console Library 8.0.0
A header-only library that makes C++ simple
Loading...
Searching...
No Matches
console::Table< T, F > Class Template Reference

双重分派函数表,用于根据两个对象的运行时类型调用注册的函数。 More...

#include <collide.h>

Public Types

typedef std::pair< std::type_index, std::type_index > KeyType
 用作映射键的类型:type_index 对。
typedef F FunctionType
 存储的函数类型。

Public Member Functions

 Table (FunctionType default_handler=FunctionType{})
 构造 Table。
void add (const std::type_index &type1, const std::type_index &type2, FunctionType func)
 注册一个类型对的处理函数(非对称)。
void add_symmetric (const std::type_info &type1, const std::type_info &type2, FunctionType func)
 对称地注册一个类型对的处理函数。
FunctionType operator() (const std::type_index &type1, const std::type_index &type2) const
 根据两个类型获取对应的处理函数。
void call (T &a, T &b) const
 根据两个对象的运行时类型调用对应的处理函数。
bool has (const std::type_index &type1, const std::type_index &type2) const
 检查是否为特定的类型对注册了处理函数。
bool has_default () const
 检查是否设置了默认处理函数。
bool callable (const std::type_index &type1, const std::type_index &type2) const
 检查是否为特定的类型对注册了处理函数,或者是否设置了默认处理函数。
void set_default (FunctionType func=FunctionType{})
 设置默认处理函数,当没有找到特定类型对的函数时调用。
void remove (const std::type_index &type1, const std::type_index &type2)
 移除一个类型对的处理函数。
void clear ()
 清空所有注册的类型对和处理函数。

Private Attributes

std::unordered_map< KeyType, FunctionType, PairHash > table
 存储类型对到函数的映射。
FunctionType default_handler
 默认处理函数。

Detailed Description

template<class T, class F = std::function<void(T &, T &)>>
class console::Table< T, F >

双重分派函数表,用于根据两个对象的运行时类型调用注册的函数。

Template Parameters
T所有操作的基类类型,函数表处理的对象都是 T 的派生类型。

该类维护一个从类型对到处理函数的映射。当需要处理两个对象时, 根据它们的实际类型(通过 typeid 获取)查找对应的处理函数并调用。 支持非对称和对称注册(自动注册两个方向)。

// 使用示例:
Table<Shape> collisionTable;
class Shape { ... }; // 提供了 collide 接口,调用
collisionTable.call(*this, other); class Circle : public Shape { ... };
class Rect : public Shape { ... };
// 更多类型...
int register = []() -> int
{
collisionTable.add_symmetric(typeid(Circle), typeid(Rect),
onCircleRect);
// 更多注册...
return 0;
}(); // 注册的最佳实践。
Circle c;
Rect r;
c.collide(r); // 自动调用合适的函数。
void add_symmetric(const std::type_info &type1, const std::type_info &type2, FunctionType func)
对称地注册一个类型对的处理函数。
Definition collide.h:138
void call(T &a, T &b) const
根据两个对象的运行时类型调用对应的处理函数。
Definition collide.h:187
Table(FunctionType default_handler=FunctionType{})
构造 Table。
Definition collide.h:114

Member Typedef Documentation

◆ FunctionType

template<class T, class F = std::function<void(T &, T &)>>
typedef F console::Table< T, F >::FunctionType

存储的函数类型。

◆ KeyType

template<class T, class F = std::function<void(T &, T &)>>
typedef std::pair<std::type_index, std::type_index> console::Table< T, F >::KeyType

用作映射键的类型:type_index 对。

Constructor & Destructor Documentation

◆ Table()

template<class T, class F = std::function<void(T &, T &)>>
console::Table< T, F >::Table ( FunctionType default_handler = FunctionType{})
inline

构造 Table。

Parameters
default_handler可选的默认处理函数,当没有找到特定类型对的函数时调用。

Member Function Documentation

◆ add()

template<class T, class F = std::function<void(T &, T &)>>
void console::Table< T, F >::add ( const std::type_index & type1,
const std::type_index & type2,
FunctionType func )
inline

注册一个类型对的处理函数(非对称)。

Parameters
type1第一个对象的类型信息。
type2第二个对象的类型信息。
func当遇到 (type1, type2) 组合时调用的函数。
Note
如果 type1 和 type2 顺序调换,需要另外注册。

◆ add_symmetric()

template<class T, class F = std::function<void(T &, T &)>>
void console::Table< T, F >::add_symmetric ( const std::type_info & type1,
const std::type_info & type2,
FunctionType func )
inline

对称地注册一个类型对的处理函数。

Parameters
type1第一个对象的类型信息。
type2第二个对象的类型信息。
func当遇到 (type1, type2)或(type2, type1) 组合时调用的函数。

该函数会同时注册 (type1, type2)和(type2, type1) 两个方向的函数, 且两个方向使用同一个处理函数。适用于碰撞检测等对称操作。

◆ call()

template<class T, class F = std::function<void(T &, T &)>>
void console::Table< T, F >::call ( T & a,
T & b ) const
inline

根据两个对象的运行时类型调用对应的处理函数。

Parameters
a第一个对象(基类引用)。
b第二个对象(基类引用)。

该函数自动获取 a 和 b 的实际类型,查找对应的处理函数并调用。

Exceptions
TypeError如果没有为这两个对象的实际类型注册函数。

◆ callable()

template<class T, class F = std::function<void(T &, T &)>>
bool console::Table< T, F >::callable ( const std::type_index & type1,
const std::type_index & type2 ) const
inline

检查是否为特定的类型对注册了处理函数,或者是否设置了默认处理函数。

Parameters
type1第一个类型的类型信息。
type2第二个类型的类型信息。
Returns
bool 如果已注册或有默认处理函数则返回 true,否则返回 false

◆ clear()

template<class T, class F = std::function<void(T &, T &)>>
void console::Table< T, F >::clear ( )
inline

清空所有注册的类型对和处理函数。

该函数会移除表中所有的类型对和对应的处理函数,但不会修改默认处理函数。

◆ has()

template<class T, class F = std::function<void(T &, T &)>>
bool console::Table< T, F >::has ( const std::type_index & type1,
const std::type_index & type2 ) const
inline

检查是否为特定的类型对注册了处理函数。

Parameters
type1第一个类型的类型信息。
type2第二个类型的类型信息。
Returns
bool 如果已注册则返回 true,否则返回 false。

◆ has_default()

template<class T, class F = std::function<void(T &, T &)>>
bool console::Table< T, F >::has_default ( ) const
inline

检查是否设置了默认处理函数。

Returns
bool 如果设置了默认处理函数则返回 true,否则返回 false。

◆ operator()()

template<class T, class F = std::function<void(T &, T &)>>
FunctionType console::Table< T, F >::operator() ( const std::type_index & type1,
const std::type_index & type2 ) const
inline

根据两个类型获取对应的处理函数。

Parameters
type1第一个对象的类型信息。
type2第二个对象的类型信息。
Returns
FunctionType 对应的处理函数。
Exceptions
TypeError如果没有为给定的类型对注册函数。

◆ remove()

template<class T, class F = std::function<void(T &, T &)>>
void console::Table< T, F >::remove ( const std::type_index & type1,
const std::type_index & type2 )
inline

移除一个类型对的处理函数。

Parameters
type1第一个类型的类型信息。
type2第二个类型的类型信息。

◆ set_default()

template<class T, class F = std::function<void(T &, T &)>>
void console::Table< T, F >::set_default ( FunctionType func = FunctionType{})
inline

设置默认处理函数,当没有找到特定类型对的函数时调用。

Parameters
func默认处理函数指针。

Member Data Documentation

◆ default_handler

template<class T, class F = std::function<void(T &, T &)>>
FunctionType console::Table< T, F >::default_handler
private

默认处理函数。

◆ table

template<class T, class F = std::function<void(T &, T &)>>
std::unordered_map<KeyType, FunctionType, PairHash> console::Table< T, F >::table
private

存储类型对到函数的映射。

键为 std::type_index 对,值为处理函数。


The documentation for this class was generated from the following file: