相关疑难解决方法(0)

通过在C++中切换,在运行时选择模板实例化

我有一组由整数类型Index和类类型模板化的函数,T我以下列方式"部分地专门化":

// Integer type
enum Index{One,Two,Three,Four};

// Default implementation
template<int I>
struct Foo{
  template<typename T> static void bar(const T& x){ std::cout <<"default" << endl; }
};

// Template specializations
template<> 
struct Foo<One>{
  template<typename T> static void bar(const T& x){ std::cout << "one" << endl; }
};
Run Code Online (Sandbox Code Playgroud)

这用于在程序的运行时使用switch语句选择一个特定的索引(这应该会产生一个高效的查找表).该开关独立于T:

template<typename T>
void barSwitch(int k, const T& x){
  switch(k){
    case ONE: Foo<ONE>::bar(x); break;
    case TWO: Foo<TWO>::bar(x); break;
    case THREE: Foo<THREE>::bar(x); break;
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,这很好用,但是这个类Foo并不是我想要应用这个开关的唯一类.事实上,我有很多类都是由相同的整数类型模板化的.所以我想barSwitch …

c++

5
推荐指数
1
解决办法
2862
查看次数

C ++函子的优势-保持状态

我确实研究了函子的整个概念,但是不幸的是,我无法理解函子相对于典型函数的真正优势。

根据一些学术脚本,函子可以保持与功能不同的状态。任何人都可以通过一些简单易懂的示例来详细说明吗?

我真的不明白为什么典型的常规功能不能做到这一点。对于这种新手问题,我真的感到很抱歉。

c++ functor

5
推荐指数
1
解决办法
1432
查看次数

c ++:从std :: map中按键弹出一个元素

我有兴趣从地图中删除具有特定键的元素并使用此元素.

看起来像:

itr = MyMap.pop(wantedKey);
//Now MyMap is missing the element which has the key 'wantedKey'.
//Do something with this element through 'itr'.
Run Code Online (Sandbox Code Playgroud)

这样做有stl map方法吗?

编辑

carleeto的回复之后,我想澄清一下:我需要的是从地图中删除的元素以及之后能够使用它的程序,它可以是元素本身作为一对,不一定是迭代器.

c++ stl map

4
推荐指数
2
解决办法
4416
查看次数

将lambda放在类定义中的干净方法

我有一个在本地函数中可以正常工作的代码:

struct Divider
{
public:
    size_t factor;
    size_t next;
};

void foo()
{
    auto cmp = [](const Divider& x, const Divider& y) { return x.next > y.next; };
    std::priority_queue < Divider, std::vector<Divider>, decltype(cmp)> sieve(cmp);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我现在想将我的sieve变量移到一个类中。我可以写出以下怪物:

class Bar
{
    inline static auto cmp = [](const Divider& x, const Divider& y) { return x.next > y.next; };
    std::priority_queue < Divider, std::vector<Divider>, decltype(cmp)> sieve = std::priority_queue < Divider, std::vector<Divider>, decltype(cmp)>(cmp);
};
Run Code Online (Sandbox Code Playgroud)

有什么方法可以编写这种默认构造而无需两次指定类型?或者只是以一种更清洁的方式。

c++ lambda class class-members c++11

4
推荐指数
1
解决办法
92
查看次数

如何将 C++ flex 与 C++ Bison 连接起来?

我正在尝试将 C++ flex 与 C++ bison 连接起来,但我被难住了。Bison 3.8.1 手册有一个带有 C Flex 的 C++ Bison 示例。Flex 2.6.4 没有示例。我试图解决的问题是如何向 C++(或 C)Bison 提供指向 C++ Flex 对象的实例指针。我最好的想法是定义YY_DECL要使用的 Flex 扫描器# define YY_DECL bison::symbol_type flx->yylex(),并通过解析器调用序列将 flx 传递到 Bison,重新定义“解析”。这样对吗?还有更好的方法吗?

c++ bison flex-lexer

4
推荐指数
1
解决办法
636
查看次数

如何在C中实现这个熟悉的功能?

考虑以S-expr表示法编写的以下代码段:

(lambda (x) (lambda (y) (+ x y)))
Run Code Online (Sandbox Code Playgroud)

或者在Javascript中:

function(x) { return function(y) { return x+y; }; }
Run Code Online (Sandbox Code Playgroud)

我怎么用C写这个?

c lisp lambda functional-programming currying

3
推荐指数
1
解决办法
252
查看次数

C++中的比较器功能意味着什么?

bool comp(const pair<int, int>& a, const pair<int,int>& b){
    if (v[a.first]>v[b.first]) {
        return true;
    }
    else if(v[a.first] == v[b.first] && a.second < b.second){
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

所以,我正在通过一个代码,我遇到了这个比较器函数,用于排序对的向量.现在,我对C++很新.我试着阅读关于这个比较器如何工作的其他问题?但我无法理解.为什么返回类型是bool?返回值true意味着什么?

c++

3
推荐指数
2
解决办法
4391
查看次数

运算符==重载抽象类和shared_ptr

我想std::find在一个shared_ptr抽象类的列表上使用,但我收到一个错误.有没有办法shared_ptr通过解除引用来比较两个std::find

是否有可能让一个operator==超载的朋友shared_ptr<A>

最小的例子:

#include "point.h"
#include <list>
#include <algorithm>
#include <memory>

using namespace std;

class A {

protected:
    Point loc;
public:

    virtual void foo() = 0;

    virtual bool operator==(const Point& rhs) const = 0;
};

class B: public A {
    virtual void foo() override{}

    virtual bool operator==(const Point& rhs) const override {
        return rhs == loc;
    }
};

class C {

    list<shared_ptr<A>> l;
    void bar(Point & p) { …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism operator-overloading shared-ptr c++11

3
推荐指数
1
解决办法
271
查看次数

std的目的:在调用<运算符时少(或类似函数)

std::less当它只调用<运算符时,为什么需要(和等效的其他函数对象),我们可以反过来运算符?

可能的答案有问题:

为什么std ::比"<"更好?

但是我并不完全相信(特别是关于弱排序).有人可以解释一下吗?

c++ c++11

3
推荐指数
1
解决办法
201
查看次数

如果通过复制传递 lambda 函数,实际上会复制什么?

如果在 C++ 中通过复制传递 lambda 函数,实际上会复制什么?

它只是一个指向 lambda 的指针吗?

或者整个捕获列表也会被复制吗?

c++

3
推荐指数
1
解决办法
436
查看次数