我不确定是否可能,所以这就是我想要找到的.
我想创建一个接受任何类型的函子/可调用对象的函数,但我想知道参数类型是什么.(但不强制执行)
所以,这个捕获所有但不给我参数的类型:
template < typename T >
void optionA( T );
Run Code Online (Sandbox Code Playgroud)
这个捕获最多,并具有参数的类型
template < typename T >
void optionB( std::function< void(T) > );
Run Code Online (Sandbox Code Playgroud)
但是这个不允许lambdas,所以
optionB( [](int){} );
Run Code Online (Sandbox Code Playgroud)
不会编译.这有点奇怪,因为这将编译:
std::function< void(int) > func = [](int){};
optionB( func );
Run Code Online (Sandbox Code Playgroud)
那么有没有办法接受所有选项,还知道期望哪种类型的参数?
提前致谢!
- 编辑 -
我想这样做的原因是我想让我的库用户注册一个特定类型的回调.对我来说,最自然的方式是
auto callback = []( int val ) { cout << "my callback " << val << endl; };
object.register( callback );
Run Code Online (Sandbox Code Playgroud)
(使用或不使用回调作为中间变量)
由于我需要根据用户期望的值类型修改行为,我需要知道他/她期望的类型.
我希望能够通过网络发送Qt信号.使用Qt的元类型系统序列化信号调用非常简单:
qMetaMethod使用静态方法创建一个::fromSignal[1]使用创建的元方法获取方法名称,参数名称,其typeIds 和值.但到目前为止,我无法弄清楚如何使用序列化数据调用信号:QMetaObject::invokeMethod(..)将信号/方法名称作为字符串.问题是参数:它们必须被提供为,QGenericArgument并且只能通过使用Q_ARG需要实际类型(不是它的名称或字符串typeId)和相关值的宏来创建.参数的数量也必须在编译时定义,没有invokeMethod(..)哪个参数列表.
我错过了什么吗?或者有更好/替代方法来做到这一点?
[1]进一步的问题:如何确保类型在使用时始终获得相同的typeId Q_DECLARE_METATYPE(..)?
我需要QList<QVariant>用作关键词std::unordered_map.这样做的目的是通过在唯一键列上建立索引来优化对数据表的搜索.
所以我制作了这段代码.它不完整,但列出了表键列中出现的一些基本数据类型:
#include <unordered_map>
#include <string>
//std::hash
#include <functional>
//std::size_t
#include <cstddef>
// Hashing method for QVariantList
namespace std {
template <>
struct hash<QList<QVariant>>
{
std::size_t operator()(const QList<QVariant>& k) const
{
using std::size_t;
using std::hash;
using std::string;
size_t hash_num = 0;
Q_FOREACH(var, k) {
// Make hash of the primitive value of the QVariant
switch(var.type()) {
case QVariant::String : {
hash_num = hash_num^hash<string>(var.toString().toStdString());
break;
}
case QVariant::Char :
case QVariant::ULongLong :
case QVariant::UInt :
case QVariant::LongLong …Run Code Online (Sandbox Code Playgroud)