【问题标题】:It is possible to use T::operator< as default parameter for template function?可以使用 T::operator< 作为模板函数的默认参数吗?
【发布时间】:2018-02-18 12:22:21
【问题描述】:

我想知道是否可以使用operator&lt; 或其他一些作为某些函数的默认参数。

一些愚蠢的 琐碎的例子:

template <typename T>
void compare(std::function<bool(T, T)> lessThan = T::operator<);

我尝试为int 做这件事为T,但当然我得到一个错误:

error: ‘operator<’ is not a member of ‘int’

我真的不知道在operator&lt; 之前是否有可能,因为我知道这不是静态函数。

您有什么想法,是否以及如何实现?

任何帮助将不胜感激! :)

【问题讨论】:

标签: c++ templates parameters c++17


【解决方案1】:

在模板函数中使用带有模板参数的std::function 几乎总是一个坏主意。

std::function 是类型擦除,模板参数是类型推导。类型擦除和类型扣除是彼此相反的。两者兼而有之,就像建一所房子只是为了把它炸毁,然后再建另一栋。

template <class T, class C=std::less<T>>
void compare(C&& c = {});

如果你想更换compartor,你可以这样做

compare<int>( some_other_comparator );

【讨论】:

  • 非常感谢您的警告 :) 我完全忘记了 std::less 功能。我知道还有std::greater,但是如果我想使用其他一些运算符,如 bitwise and 作为默认参数怎么办? operator 函数有什么约定吗?
  • @BartekPL 您始终可以编写自己的函数对象。但是std::bit_and&lt;T&gt; 存在。
  • 啊,好的。再一次感谢你 ! :)
【解决方案2】:

您总是可以模仿标准库的功能。

template<typename T,typename C=std::less<T>>
void compare()
{
  C comparator{};
  //Your logic here
}

这样,您不必在将谓词传递给compare function 之前对其进行实例化。 但是您现在必须通过以下方式调用compare 函数

compare<YourType>();

如果您需要更改 compare 函数使用的谓词,您可以这样调用它

compare<YourType,NewComparator<>>()

【讨论】:

    猜你喜欢
    • 2012-07-25
    • 2012-06-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2015-05-19
    相关资源
    最近更新 更多