小编svo*_*ron的帖子

以最小的开销编译时间生成的函数调度程序

我正在尝试使用编译时生成的数组来实现快速函数调度程序,以便能够在运行时在O(1)中使用它.

一些代码行只是为了澄清:

template<int i>
void f()
  {
  // do stuff 
  }

// specialized for every managed integer 
template<>
void f<1>
{
// do stuff
}

Dispatcher<1,5,100,300> dispatcher;  
dispatcher.execute(5); // this should call f<5>()
Run Code Online (Sandbox Code Playgroud)

我们将调度器的输入数量(在这种情况下为4)调用N,并且在这种情况下调度调度器输入(300)的最大值.

我已经能够创建一个大小等于M的数组.这利用了这样一个事实:在运行时你可以做类似的事情:

dispatcher.execute(5) -> internalArray[5]();
Run Code Online (Sandbox Code Playgroud)

这当然是有效的,但对于大尺寸的阵列来说这是不可行的.

最好的方法是仅生成N个元素的数组,并做一些数学技巧将输入索引转换为第二个数组的索引.

在这个例子中,将1,5,100,300分别转换为0,1,2,3.我已经能够做一种预处理方法来改造它们,但我正在寻找一种避免这一步骤的方法.

换句话说,我认为我正在寻找某种最小的完美散列,可以在编译时以非常有效的方式用于我的特定情况(理想情况下没有任何开销,例如:goto:MyInstruction).

我不是在寻找使用虚函数,std :: map或复杂操作的替代方法.

请问是否有不清楚的事情.

PS我正在使用C++ 11,但任何想法都是受欢迎的

[编辑]我知道标签是GCC的语言扩展值.有了这些我可能能够实现我的目标,但需要一个便携式解决方案.

c++ perfect-hash template-meta-programming constexpr c++11

8
推荐指数
1
解决办法
669
查看次数

CRTP和模板模板参数限制

我正在尝试使用CRTP,但我很困惑为什么以下代码无法编译.

template<template<class...> class CBase>
struct ComponentX : public CBase<ComponentX>
  {
  // This does NOT compile
  };

template<template<class...> class CBase>
struct ComponentY : public CBase<int>
  {
  // This does compile
  };
Run Code Online (Sandbox Code Playgroud)

您知道在CRTP的情况下模板模板参数是否有一些限制?

c++ templates crtp template-meta-programming

7
推荐指数
1
解决办法
122
查看次数

顺序异构函数执行器

让我们假设有N个函数采用不同的输入并返回不同的值:

int h(int);
string g(int);
double f(string);
Run Code Online (Sandbox Code Playgroud)

当然可以这样写:

f(g(h(4)))  
Run Code Online (Sandbox Code Playgroud)

现在假设我想将这些函数f,g,h存储到一种容器中,如:

Container c;
c.add(h);
c.add(g);
c.add(f); 
Run Code Online (Sandbox Code Playgroud)

给定第一个函数的输入(在f的情况下为int)我希望这些函数以顺序方式执行,每个函数都将前一个函数的输出作为输入.

你认为在C++中有可能吗?可能没有使用dynamic_cast和使用C++ 11

c++ inheritance types template-meta-programming c++11

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

在 void 和继承的函数成员中启用_if

我试图理解为什么这段代码不能编译:

// test.h
struct Base
  {
  virtual ~Base{};
  virtual void execute() {}
  virtual void execute(int) {}
  virtual void execute(double) {}
  }

template<class T>
struct Test : Base
  {
    void execute(typename std::enable_if<std::is_void<T>::value, void>::type)
      {
      // Do A
      }

    void execute(typename std::enable_if<!std::is_void<T>::value, int>::type t)
      {
      // Do B
      }
  };

// main.cpp
Test<void> t; 
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误:“没有名为类型的类型”。

即使我修改代码的 A 版本,也会出现同样的错误

std::enable_if<std::is_void<T>::value>
Run Code Online (Sandbox Code Playgroud)

目标是创建一个类,该类根据参数 T 创建不同的函数成员。在本例中是 2,但我也对更多感兴趣。

[编辑]我添加了我在评论中讨论的继承部分。

c++ templates enable-if template-meta-programming c++11

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

使用模板继承和转换不按预期工作

我一直在玩模板和继承,但是在对基类执行强制转换时,使用带有模板参数的虚函数成员有一些奇怪之处.他们似乎使用"直接继承",但如果我稍后"推迟"继承,则不行.

一些代码来说明:

示例[1]

struct CastExBase
  {
  virtual void f() {}
  };

template<class RT>
struct CastExA : CastExBase
  {
  void f() {std::cout << "CastExA" << std::endl;}
  virtual void g() {std::cout << "g - A" << std::endl;}
  virtual RT h() {std::cout << "h - A" << std::endl;}
  };

struct CastExB
  {
  void execF() {std::cout << "CastExB" << std::endl;}
  void g() {std::cout << "g - B" << std::endl;}
  int h() {std::cout << "h - B" << std::endl;}
  };

struct CastExC :
    public CastExA<int>, …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism inheritance templates casting

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