如何创建一个函数可能会使用自定义的C ++?

时间:2018-05-19 23:35:15

标签: c++ function templates

我试图创建一个需要两个比较两个对象的函数,但我希望它可以与std :: sort一样可用。

换句话说,我希望这些代码能够用C ++编译

bool mycomp(int a, int b) {return a<b;}
int main () {
   deque<int> qu;
   special_push(qu, 3);
   special_push(qu, 5, less<int>());
   special_push(qu, 5, mycomp);
}

到目前为止我已尝试过:

template< typename _Compare > void push (deque<int> & qu,int val, _Compare comp = less<int>()) {
    while(qu.empty()==false &&  comp(val, qu.back())) {
      qu.pop_back();
    }
    qu.push_back(val);

}

2 个答案:

答案 0 :(得分:0)

修复明显的拼写错误后,您丢失的内容是模板参数的默认值:

    .fighter-card {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 400px;
    min-height: 400px;
    }

    .fighter-card .front {
    width: 100%;
    height: 100%;
    background: #171717;
    padding: 30px;
    box-sizing: border-box;
    transition: .5s;
    transform-origin: right;
    float: left;
}

.ranking-position {
    font-weight: bold;
    width: 50%;
    text-align: left;
    float: left;
    color: #fff;
    font-size: 40px;
}

.more {
    width: 50%;
    text-align: right;
    cursor: pointer;
    float: right;
    font-size: 24px;
    color: #fff;
    display: block;
}

.fighter-picture {
    background-size: cover;
}

.information {
    margin: 0;
    padding: 0;
}

.information li {
    padding: 10px 0;
    border-bottom: 2px solid #fff;
    display: flex;
    font-weight: bold;
    cursor: pointer;
    color: #fff;
}

.information li:last-child {
    border-bottom: none;
}

.information li .information-left {
    width: 50%;
}

.information li .information-right {
    width: 50%;
    text-align: right;
}

.fighter-card .back {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    padding: 30px;
    background: rgba(0,0,0,0.7);
    box-sizing: border-box;
    transform-origin: left;
    transition: .5s;
    transform: translateX(100%) rotateY(90deg);
}

.fighter-card .back.active {
    transform: translateX(0) rotateY(0deg);
}

.fighter-card .front.active {
    transform: translateX(0) rotateY(0deg);
}

.fighter-card .front {
    transform: translateX(-100%) rotateY(90deg);
}

.go-back {
    font-size: 24px;
    color: #fff;
    text-align: right;
}

.go-back .fa {
    cursor: pointer;
}

或者,您可以使用重载函数(这通常是libstdc ++在内部执行的操作,但我不知道有任何理由这样做。)

请注意,您可能应该解决几个风格或迂腐问题。

答案 1 :(得分:0)

你快到了。您缺少的只是Compare的默认类型。我还推荐使用模板化运算符的新std::less<>

template <class Compare = std::less<>>
//                      ^~~~~~~~~~~~~
auto special_push(std::deque<int> & qu, int val, Compare comp = std::less<>{}) -> void
{
    while(!qu.empty() && comp(val, qu.back()))
    {
      qu.pop_back();
    }
    qu.push_back(val);
}