Во-первых, я хочу сообщить вам, что моя главная / главная цель — выполнить определенные функции, используя их имя функции (строку) в качестве аргумента, я определил функцию следующим образом:
(Я хочу создать уникальный номер для каждой строки данных, которые я вставил в качестве аргумента функции)
#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 ()? (Также обратите внимание, я хочу реализовать коммутатор тоже)
Вы рассматривали что-то вроде
#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).
Не используйте hash_value () для снятия отпечатков пальцев (это то, что вы описываете). Если вы действительно знаете все возможные строки заранее, используйте свой собственный идеальный хэш функции, а затем измерить результаты, чтобы увидеть, если оно того стоит.