c++ - 将函数应用于所有模板参数

标签 c++ templates variadic-templates

我正在尝试创建一个函数,通过 id 查找元素并将其从某些类型的静态 vector 中删除。

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

关于c++ - 将函数应用于所有模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59405946/

相关文章:

c++ - 模糊指向堆或堆栈对象的智能指针

c# - 将字节数组从 C++ 调用到 C#

c++ - C++17 中的模板化 lambda 没有自动参数

c++ - 编译和评估 conditional_t 中的错误大小写问题

c++ - C++ 中的引用在内部编译为指针还是别名?

c++ - Boost::C++ 数据复制的信号

c++ - 竞争隐式和模板复制构造函数

c++ - 在可变模板参数中混合类型和非类型?

c++ - 从函数参数构建模板?

c++ - 可变函数和折叠表达式 : Fatal Error while trying to compile in Visual Studio 2017