将函数应用于所有模板参数
Applying a function to all template parameters
我正在尝试创建一个函数,通过 id 查找元素并将其从某些类型的静态向量中删除。
template<typename First>
void RemoveComponentByID(EntityID ID)
{
auto element = binary_find(First::Array.begin(), First::Array.end(), ID);
First::Array.erase(element);
}
template<typename First, typename... Rest>
void RemoveComponentByID(EntityID ID)
{
auto element = binary_find(First::Array.begin(), First::Array.end(), ID);
First::Array.erase(element);
RemoveComponentByID<Rest...>(ID);
}
但是当我调用函数时RemoveComponentByID<Vector3s,Textures>(id);
弹出错误“'RemoveComponentByID':对重载函数的模糊函数调用”。
这是为什么?
对于过载解决方案,
之间有一个决胜局
template <typename T> void foo(T);
template <typename T, typename ...Ts> void foo(T, Ts...);
赞成非可变参数,
但是当那些模板不是你的函数参数的一部分时,它不是 cas。
所以,
template <typename T> void bar();
template <typename T, typename ...Ts> void bar();
更专业,因此对 bar<SomeType>()
.
的调用不明确
你可能会这样做 (C++17):
template<typename First, typename... Rest>
void RemoveComponentByID(EntityID ID)
{
auto element = binary_find(First::Array.begin(), First::Array.end(), ID);
First::Array.erase(element);
if constexpr (sizeof...(Rest) > 0) {
RemoveComponentByID<Rest...>(ID);
}
}
或者,没有递归:
template<typename T>
void RemoveComponentByIDImpl(EntityID ID)
{
auto element = binary_find(T::Array.begin(), T::Array.end(), ID);
T::Array.erase(element);
}
template<typename... Ts>
void RemoveComponentByID(EntityID ID)
{
(RemoveComponentByIDImpl<Ts>(ID), ...);
}
我正在尝试创建一个函数,通过 id 查找元素并将其从某些类型的静态向量中删除。
template<typename First>
void RemoveComponentByID(EntityID ID)
{
auto element = binary_find(First::Array.begin(), First::Array.end(), ID);
First::Array.erase(element);
}
template<typename First, typename... Rest>
void RemoveComponentByID(EntityID ID)
{
auto element = binary_find(First::Array.begin(), First::Array.end(), ID);
First::Array.erase(element);
RemoveComponentByID<Rest...>(ID);
}
但是当我调用函数时RemoveComponentByID<Vector3s,Textures>(id);
弹出错误“'RemoveComponentByID':对重载函数的模糊函数调用”。
这是为什么?
对于过载解决方案,
之间有一个决胜局template <typename T> void foo(T);
template <typename T, typename ...Ts> void foo(T, Ts...);
赞成非可变参数, 但是当那些模板不是你的函数参数的一部分时,它不是 cas。
所以,
template <typename T> void bar();
template <typename T, typename ...Ts> void bar();
更专业,因此对 bar<SomeType>()
.
你可能会这样做 (C++17):
template<typename First, typename... Rest>
void RemoveComponentByID(EntityID ID)
{
auto element = binary_find(First::Array.begin(), First::Array.end(), ID);
First::Array.erase(element);
if constexpr (sizeof...(Rest) > 0) {
RemoveComponentByID<Rest...>(ID);
}
}
或者,没有递归:
template<typename T>
void RemoveComponentByIDImpl(EntityID ID)
{
auto element = binary_find(T::Array.begin(), T::Array.end(), ID);
T::Array.erase(element);
}
template<typename... Ts>
void RemoveComponentByID(EntityID ID)
{
(RemoveComponentByIDImpl<Ts>(ID), ...);
}