0

首先,我想告诉你,我的总体/主要目标是使用它们的函数名称(字符串)作为参数来执行某些函数,我定义了一个函数如下:(我想为我生成的每个字符串数据生成一个唯一的数字作为函数的参数插入)

    #include <iostream>
    #include <string>
    #include <hash_set>

    using namespace std;
    void Func_Execution(string &s){
        int k=stdext::hash_value(s);
     #if(_MSC_VER ==1500)
        switch (k)
        {
        case -336300864: GETBATTERYCALLSIGNS();
            break;
        case -1859542241:GETGUNIDS();
            break;
        case 323320073:Foo(); // here int k=323320073 for string s="Foo"
            break;
        case 478877555:Bar();
            break;
            defalut :Exit();
               break;
         }
    #endif
    }

这里我调用 Func_Execution 函数如下:

void main(){
string s="Foo";
Func_Execution(s);
}

我想知道是否有任何有效的(考虑性能/耗时)和有效的机制来为某些字符串(字符模式)生成唯一的数值而不是使用 stdext::hash_value() 函数?(另请注意我想实现开关盒也是)

4

2 回答 2

1

你有没有考虑过类似的东西

#include <functional>
#include <iostream>
#include <unordered_map>
#include <string>

using std::cout;
using std::endl;
using std::function;
using std::string;
using std::unordered_map;

class Registry {
 public:
  static void Execute(const string& function) {
    if (functions_.find(function) != functions_.end()) {
      functions_[function]();
    }
  }
  static int Register(const string& function_name, function<void()> f) {
    functions_.emplace(function_name, f);
    return functions_.size();
  }
  static void Dump() {
    for (auto& i : functions_) {
      cout << i.first << endl;
    }
  }
 private:
  Registry() {};
  static unordered_map<string, function<void()>> functions_;
};

unordered_map<string, function<void()>> Registry::functions_;

#define REGISTER_FUNCTION(F) \
  namespace { \
   const int REGISTERED__##F = Registry::Register(#F, &F); \
  } 

void foo() {
  cout << "foo" << endl;
}

REGISTER_FUNCTION(foo);

void bar() {
  cout << "bar" << endl;
}

REGISTER_FUNCTION(bar);

int main() {
  Registry::Execute("foo");
  Registry::Execute("foo");
  Registry::Execute("unknown");
  Registry::Dump();
  return 0;
}

它应该适合您的用例。我只是一起破解了它,某处可能存在错误,但它可以编译并运行(c ++ 11)。

于 2013-10-31T07:08:03.840 回答
0

不要使用 hash_value() 进行指纹识别(这就是您所描述的)。如果您真的提前知道所有可能的字符串,请使用您自己的完美哈希函数,然后测量结果以查看是否值得。

于 2013-10-31T14:39:42.177 回答