gpt4 book ai didi

c++ - 以模板函数作为参数的可变参数模板函数

转载 作者:行者123 更新时间:2023-11-30 02:54:43 25 4
gpt4 key购买 nike

我正在尝试编译以下内容:

#include <vector>
#include <array>

template <typename T>
void sort(T &container) {}

template <typename F, typename T, typename ...Tail>
void sort_containers(F sort_func, T &container, Tail &...tail) {
sort_func(container);
sort_containers(sort_func, tail...);
}

template <typename F, typename T>
void sort_containers(F sort_func, T &container) {
sort_func(container);
}

int main() {
std::vector<int> x = {1,2,3};
std::vector<double> y = {1.0, 2.0, 3.0};
std::array<char, 3> z = {{'d' , 'b', 'c'}};
sort_containers(sort, x, y, z);
}

这会导致 g++4.8 出现以下编译器错误:

error: no matching function for call to 
‘sort_containers(<unresolved overloaded function type>,
std::vector<int>&, std::vector<double>&, std::array<char, 3u>&)’

我知道在将 sort 传递给 sort_containers 时,我需要为它指定模板参数,但我不确定在存在可变参数的情况下它是如何工作的模板函数。

最佳答案

template 函数是函数工厂,而不是函数。它们不能直接传递。

现在,仿函数可以了,一个相对简单的包装器可以将一组重载的函数变成一个仿函数:

struct sort_functor {
template<typename...Args>
auto operator()(Args&&... args) const ->
decltype(sort(std::forward<Args>(args)... ) )
{ return sort(std::forward<Args>(args)... ); }
};

可以通过宏生成,但不能通过模板生成,因为您不能传递重载集!然后将 sort_functor() 传递给您的其他 template

#define MAKE_OVERLOAD_FUNCTOR( NAME ) \
struct CONCAT( NAME, _functor ) { \
template<typename...Args> \
auto operator()(Args&&... args) const -> \
decltype(NAME(std::forward<Args>(args)... ) ) \
{ return NAME(std::forward<Args>(args)... ) } \
};

有人提议通过进一步滥用 [] 标记来自动生成上述仿函数。

关于c++ - 以模板函数作为参数的可变参数模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16879246/

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