相关疑难解决方法(0)

接受任何类型的可调用并且也知道参数类型

我不确定是否可能,所以这就是我想要找到的.

我想创建一个接受任何类型的函子/可调用对象的函数,但我想知道参数类型是什么.(但不强制执行)

所以,这个捕获所有但不给我参数的类型:

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)

(使用或不使用回调作为中间变量)

由于我需要根据用户期望的值类型修改行为,我需要知道他/她期望的类型.

c++ lambda templates functor c++11

14
推荐指数
2
解决办法
2733
查看次数

Qt通过网络的信号/插槽机制

我希望能够通过网络发送Qt信号.使用Qt的元类型系统序列化信号调用非常简单:

  • qMetaMethod使用静态方法创建一个::fromSignal
  • [1]使用创建的元方法获取方法名称,参数名称,其typeIds 和值.
  • 将所有内容打包为您的首选格式(JSON,XML)并发送.

但到目前为止,我无法弄清楚如何使用序列化数据调用信号:QMetaObject::invokeMethod(..)将信号/方法名称作为字符串.问题是参数:它们必须被提供为,QGenericArgument并且只能通过使用Q_ARG需要实际类型(不是它的名称或字符串typeId)和相关值的宏来创建.参数的数量也必须在编译时定义,没有invokeMethod(..)哪个参数列表.

我错过了什么吗?或者有更好/替代方法来做到这一点?

[1]进一步的问题:如何确保类型在使用时始终获得相同的typeId Q_DECLARE_METATYPE(..)

c++ qt

5
推荐指数
1
解决办法
424
查看次数

如何哈希QVariant?

我需要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)

c++ qt qvariant stdhash

2
推荐指数
1
解决办法
753
查看次数

标签 统计

c++ ×3

qt ×2

c++11 ×1

functor ×1

lambda ×1

qvariant ×1

stdhash ×1

templates ×1