优雅的方式来使用模板发送模板功能

我有一个模板函数,说,这样的排序功能


template <typename iter="">
void sort1/Iter first, Iter last/ {...}

template <typename comp="" iter,="" typename="">
void sort1/Iter first, Iter last, Comp comp/ {...}


在哪里
Iter

它可能是迭代器或指针。

我有另一个模板函数,在不同的情况下使用各种计算机:


template <typename iter="">
void func_using_sort/Iter first, Iter last, int cond/ {
if /cond == 0/ {
sort1/first, last, []/const auto&amp; a, const auto&amp; b/ {
// code 1
}/;
} else if /cond == 1/ {
sort1/first, last, []/const auto&amp; a, const auto&amp; b/ {
// code 2
}/;
} else if /cond == 2/ {
sort1/first, last/;
}
}


现在我想总结一下
func_using_sort

, 使用具有相同接口的任何排序功能 , 我。
sort1

, 让我们说


template <typename iter="">
void sort2/Iter first, Iter last/ {...}
template <typename comp="" iter,="" typename="">
void sort2/Iter first, Iter last, Comp comp/ {...}


有优雅的方式来实现这一目标吗?
</typename></typename></typename></typename></typename>
已邀请:

冰洋

赞同来自:

原则上,您可以简单地传递对象对象,您如何进行
comp

:


template <typename iter,="" sort="" typename="">
void func_using_sort/Iter first, Iter last, Sort sort, int cond/ {
if /cond == 0/ {
sort/first, last, []/const auto&amp; a, const auto&amp; b/ {
// code 1
}/
} else if /cond == 1/ {
sort/first, last, []/const auto&amp; a, const auto&amp; b/ {
// code 2
}/
}
}


问题是如何通过此功能的函数模板或一组过载函数。 目前在这个问题上没有一个非常纯粹的解决方案,但下面的工作 C++14 使用普遍 lambda:


func_using_sort/first, last, []/auto... args/{ return sort2/args.../; }, cond/;


这种模式的更一般版本,使完美发货是Sfinae友好的,并关心其他极端情况,您可以找到,例如,在
http://www.open-std.org/jtc1/s ... .html
标准委员会 C++.:


#define FWD/x/ static_cast<decltype &&="" x="">/x/
#define RETURNS/expr/ noexcept/noexcept/expr// -&gt; decltype/expr/ { return expr; }
#define OVERLOADS_OF/name/ [&amp;]/auto&amp;&amp; ...args/ RETURNS/name/FWD/args/...//


然后他会的


func_using_sort/first, last, OVERLOADS_OF/sort2/, cond/;


或者,您可以包装函数
sort2

在函数类中,在这种情况下,您可以将其直接传输到上面定义的函数。 目前,遗憾的是,没有办法将功能的模板直接转换为函数的参数。 这就是上述文章和其他文章正在努力解决的问题。
</decltype></typename>

郭文康

赞同来自:

@walnut 给出了一个很好的答案。 但我刚刚发现如何使用函数,我不能 /而不使用模板模板参数/. 我把它放在这里以进一步使用。


template <typename iter="">
struct Sort1 {
template <typename comp="">
void operator///Iter first, Iter last, Comp comp/ {
sort1/first, last, comp/;
}

void operator///Iter first, Iter last/ {
sort1/first, last/;
}
};

template <typename iter="" sort,="" typename="">
void func_using_sort/Sort sort, Iter first, Iter last, int cond/ {
if /cond == 0/ {
sort/first, last, []/const auto&amp; a, const auto&amp; b/ {
// code 1
}/;
} else if /cond == 1/ {
sort/first, last, []/const auto&amp; a, const auto&amp; b/ {
// code 2
}/;
} else if /cond == 2/ {
sort/first, last/;
}

template <typename iter="">
void func_using_sort1/Iter first, Iter last, int cond/ {
func_using_sort/Sort1<iter>//, first, last, cond/;
}


</iter></typename></typename></typename></typename>

要回复问题请先登录注册