将函数应用于所有模板参数

时间:2019-12-19 08:37:53

标签: c++ templates variadic-templates

我正在尝试创建一个通过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':对重载函数的函数调用不明确”。 为什么会这样?

1 个答案:

答案 0 :(得分:0)

为解决过载,在两者之间要有一个决胜器

  • 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), ...);
}