- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在寻找一种数据结构,该数据结构有利于实现决策矩阵,一方面具有非 POD 类型的参数,另一方面具有回调函数。
特别是我想在参数的集合/元组和回调函数之间使用某种一对一的对应关系。在这种情况下,存在一组特定的参数值会导致回调的明确定义,类似这样:
template<typename t1, typename t2, ...>
(t1 arg1 == _1_1, t2 arg2 == _2_1, t3 arg3 == _3_1) -> void callback_func_1()
(t1 arg1 == _1_2, t2 arg2 == _2_2, t3 arg3 == _3_2) -> void callback_func_2()
(t1 arg1 == _1_3, t2 arg2 == _2_3, t3 arg3 == _3_3) -> void callback_func_3()
...
(t1 arg1 == _1_n, t2 arg2 == _2_n, t3 arg3 == _3_n) -> void callback_func_n^3()
应该有一个搜索方法,该方法将选择与值等于给定值的参数集对应的回调函数(在类 C++ 伪代码的术语中):
template<typename t1, typename t2, ...>
void CallbackMatrix::SelectCallback(t1& arg1, t2& arg2, t3& arg3, ...)
{
BOOST_FOREACH(const auto& item, Matrix)
{
if( arg1 == item.arg1 && arg2 == item.arg2 && ... )
{
item.function();
break;
}
}
}
从我的角度来看,这个数据结构可能对许多开发人员有用,所以我正在寻找这个数据结构的库实现(可能是在 Boost 中的某个地方?)。如果有人提供他自己的这种数据结构版本,我将不胜感激。
谢谢。
最佳答案
你要找的东西对我来说似乎很复杂。你确定你不能重新设计你的程序来避免这种情况吗?
无论如何,让我们将您的非 POD 类型视为类 MyType
struct MyType
{
int i;
double d;
std::string s;
MyType(...) {...} //ctor
bool operator<( const MyType& other) //define a 'lexicographical' order
{
if( i < other.i
|| ( i == other.i && d < other.d )
|| ( i == other.i && d == other.d && s.compare( other.s ) < 0 ) )
{
return true;
}
else
return false;
}
};
然后,我们不使用回调,而是使用 strategy pattern .
class MyFunc
{
public:
virtual void function( MyType& ) = 0;
virtual ~MyFunc() = default;
};
class FirstImpl : public MyFunc
{
public:
void function( MyType& t ) {...} // do something
};
class SecondImpl : public MyFunc
{
public:
void function( MyType& t ) {...} // do something else
};
最后,使用一个映射,其中键是 MyType(这就是为什么我们需要在 MyType 中重载运算符 <)并且值是(指向)MyFunc 派生对象。
std::map<MyType, MyFunc*> Matrix;
//feed you map
MyType t1( 42, 0., "hey" );
MyType t2( 7, 12.34, "cool" );
MyFunc *f1 = new FirstImpl;
MyFunc *f2 = new SecondImpl;
Matrix.insert( std::make_pair<MyType, MyFunc*>( t1, f1 ) ); // can also use the C++11 map::emplace
Matrix.insert( std::make_pair<MyType, MyFunc*>( t2, f2 ) );
然后,你可以调用你的选择函数
template<typename t1, typename t2, ...>
void CallbackMatrix::SelectCallback(t1& i, t2& d, t3& s, ...)
{
for_each(const auto& item : Matrix)
{
if( i == item.first.i && d == item.first.d && ... )
{
item.second->function( item.first );
break;
}
}
}
这个解决方案适合你吗?
注意:以下为伪代码;我没有尝试编译它!但想法就在这里。
我们仍然需要一个 MyType
类来重载运算符 <。请注意,MyType
变成了 POD。有问题吗?
struct MyType
{
std::vector< boost::any > myVec;
bool operator<( const MyType& other)
{
if( myVec.size() != other.myVec.size() )
return false;
else
{
for( int i = 0; i < myVec.size(); ++i )
{
if( myVec[i] < other.myVec[i] ) // so types must be comparable
return true;
else if( myVec[i] > other.myVec[i] )
return false;
}
return false; // meaning myVec and other.myVec are identical
}
}
};
然后,SelectCallback 变成了
void CallbackMatrix::SelectCallback( std::vector< boost::any > args )
{
for_each(const auto& item : Matrix)
if( args.size() == item.first.myVec.size() )
{
auto mismatch_pairs = std::mismatch( args.begin(),
args.end(),
item.first.myVec.begin() );
if( mismatch_pairs.empty() ) // if no mismatch
{
item.second->function( item.first );
break;
}
}
}
当然,用数据填充MyType对象会略有不同,像
MyType t1;
t1.myVec.push_back( 42 );
t1.myVec.push_back( 0. );
t1.myVec.push_back( static_cast<char const *>("hey") );
关于c++ - C++中回调矩阵实现的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22592159/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!