我正在处理一个问题,将T
类型的NxN矩阵旋转90度。在干燥的精神,我想我的旋转功能的函数签名看起来像这样:如何使用模板推断std :: function的参数类型?
template <typename T, std::size_t N>
void rotate_90(Matrix<T, N>& m, std::function<void(T&, T&, T&, T&)> swap_direction);
这将允许我简单地通过传递不同的std::function<void(T&, T&, T&, T&)>
交换具有相同功能的顺时针和逆时针。
目前,我有以下代码:
#include <iostream>
#include <array>
#include <functional>
template <typename T, std::size_t N>
using Matrix = std::array<std::array<T, N>, N>;
template <typename T>
void four_way_swap_clockwise(T& top_left, T& top_right, T& bottom_left, T& bottom_right) {
T temp = top_left;
top_left = top_right;
top_right = bottom_right;
bottom_right = bottom_left;
bottom_left = temp;
}
template <typename T, std::size_t N>
void rotate_90(Matrix<T, N>& m, std::function<void(T&, T&, T&, T&)> swap_direction) {
for(std::size_t i = 0; i < N/2; ++i) {
for(std::size_t j = 0; j < (N+1)/2; ++j) {
swap_direction(
m[i][j],
m[N-j-1][i],
m[j][N-i-1],
m[N-i-1][N-j-1]
);
}
}
}
int main() {
constexpr std::size_t N = 5;
Matrix<int, N> m {{
{{1,2,3,4,5}},
{{6,7,8,9,10}},
{{11,12,13,14,15}},
{{16,17,18,19,20}},
{{21,22,23,24,25}}
}};
std::function<void(int&, int&, int&, int&)> swap_clockwise(four_way_swap_clockwise);
rotate_90(m, swap_clockwise);
}
这目前无法编译,并出现以下错误失败:
error: no matching function for call to 'std::function<void(int&, int&, int&, int&)>::function(<unresolved overloaded function type>)'
std::function<void(int&, int&, int&, int&)> swap_clockwise(four_way_swap_clockwise);
然而,即使它编译,这也违背了模板编程的目的是指定交换功能的参数类型的类型(即在std::function<void(int&, int&, int&, int&)> swap_clockwise(four_way_swap_clockwise);
的定义中)。
我怎样才能通过std::function
推断模板类型?
任何理由,你为什么不能简单地用一个模板类型来表示的功能? – WhiZTiM
@WhiZTiM如果我明白你的意思,你建议一个全局作用域的'std :: function'。它是否正确?如果是这样,这绝对是一种选择,但我不确定这是多么地道/恰当。我对''很不熟悉,并且还不知道这些技巧。 :) –
erip
@erip - 不确定要进行...什么是错误的'std :: function swap_clockwise(four_way_swap_clockwise );'? –
max66