- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
代码应该通过从字符串中提取参数来回调函数。但是,顺序更改如下:(Visual Studio 2013 AND 2015!express)
"1 2 3 4" int, double, string, int -> 3 2 4 1
"1 2 3 4" int, double, float, int -> 4 3 2 1
编辑:它works properly in gcc并且是 MS Visual C++ compiler bug - 针对 VS2013 和 VS2015 进行了测试。有谁知道解决方法? (也许使用一些 C++14 特性?)
Edit2:我解决了它向参数添加索引并删除元组的问题 http://cpp.sh/9jc5
这里是示例:
void one(int i, double d, string s, int ii)
{
std::cout << "function one(" << i << ", " << d << ", " << s << ", " << ii << ");\n";
}
int main()
{
RegisterRPC<int, double, string, int>("test1", one);
DataSource* data = new DataSource("1 2 3 4");
functionarray["test1"](data);
}
以及完整的代码:
#include <stdlib.h>
#include <functional>
#include <tuple>
#include <map>
#include <iostream>
#include <istream>
#include <sstream>
#include <string>
// ------------- UTILITY---------------
template<int...> struct index_tuple{};
template<int I, typename IndexTuple, typename... Types>
struct make_indexes_impl;
template<int I, int... Indexes, typename T, typename ... Types>
struct make_indexes_impl<I, index_tuple<Indexes...>, T, Types...>
{
typedef typename make_indexes_impl<I + 1, index_tuple<Indexes..., I>, Types...>::type type;
};
template<int I, int... Indexes>
struct make_indexes_impl<I, index_tuple<Indexes...> >
{
typedef index_tuple<Indexes...> type;
};
template<typename ... Types>
struct make_indexes : make_indexes_impl<0, index_tuple<>, Types...>
{};
// ----------UNPACK TUPLE AND APPLY TO FUNCTION ---------
using namespace std;
template<class Ret, class... Args, int... Indexes >
Ret apply_helper(Ret(*pf)(Args...), index_tuple< Indexes... >, tuple<Args...>&& tup)
{
return pf(forward<Args>(get<Indexes>(tup))...);
}
template<class Ret, class ... Args>
Ret apply(Ret(*pf)(Args...), const tuple<Args...>& tup)
{
return apply_helper(pf, typename make_indexes<Args...>::type(), tuple<Args...>(tup));
}
template<class Ret, class ... Args>
Ret apply(Ret(*pf)(Args...), tuple<Args...>&& tup)
{
return apply_helper(pf, typename make_indexes<Args...>::type(), forward<tuple<Args...>>(tup));
}
// --- make tuple ---
template <typename T> T read(std::istream& is)
{
T t; is >> t; cout << t << endl; return t;
}
template <typename... Args>
std::tuple<Args...> parse(std::istream& is)
{
return std::make_tuple(read<Args>(is)...);
}
template <typename... Args>
std::tuple<Args...> parse(const std::string& str)
{
std::istringstream ips(str);
return parse<Args...>(ips);
};
// ---- RPC stuff
class DataSource
{
std::string data;
public:
DataSource(std::string s) { data = s; };
template<class...Ts> std::tuple<Ts...> get() { return parse<Ts...>(data); };
};
std::map<std::string, std::function<void(DataSource*)> > functionarray;
template<typename... Args, class F>
void RegisterRPC(std::string name, F f) {
functionarray[name] = [f](DataSource* data){apply(f, data->get<Args...>()); };
}
// --------------------- TEST ------------------
void one(int i, double d, string s, int ii)
{
std::cout << "function one(" << i << ", " << d << ", " << s << ", " << ii << ");\n";
}
int main()
{
RegisterRPC<int, double, string, int>("test1", one);
DataSource* data=new DataSource("1 2 3 4");
functionarray["test1"](data);
system("pause");
return 0;
}
// --------------------- TEST ------------------
使用的引用资料
How do I expand a tuple into variadic template function's arguments?
最佳答案
改变:
template <typename... Args>
std::tuple<Args...> parse(std::istream& is)
{
return std::make_tuple(read<Args>(is)...);
}
进入:
template <typename... Args>
std::tuple<Args...> parse(std::istream& is)
{
return std::tuple<Args...>{ read<Args>(is)... };
}
否则,未指定函数 read
的调用顺序。
关于c++ - 解包后可变元组顺序根据数据类型发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32914361/
我刚刚更新了一些 flutter 包。但是,我在执行 flutter run 时不断收到此错误。如果我将 apk 直接安装到设备上,它工作正常(这意味着我可以做 flutter build apk),
这是来自 vscode 的日志 Launching lib/main.dart on iPhone 11 in debug mode... Running pod install...
我是移动应用开发的新手,这是我第一次试用 Flutter。我正在尝试构建一个条码扫描器应用程序,在添加 barcode_scan 包并在项目中适当使用它之后,它无法成功构建。这是我在下面得到的错误 C
我想从以下 repo https://github.com/geomin/django-countria 安装一个包. 我使用的命令是 pip install git://github.com/geo
我开始学习 meteor 并设置了一个小型测试项目。我制作了一个简单的模板,例如 test.html:
我在一个干净的应用程序中测试了该包,它工作正常,但是当我尝试将 pushwoosh-react-native-plugin 添加到现有应用程序时,它会在启动时关闭并且不会引发错误在 Firebase
重构一些包/类后,当我尝试提交我的项目时,我收到此错误: org.tigris.subversion.javahl.ClientException:svn:提交失败(详细信息如下):svn:项目“我的
创建 python 包后,无法从其他目录访问一个目录中的 .robot 文件中的关键字。虽然我可以访问 .py 的方法,但不能访问 .robot 文件。 我已经创建了 Python 包(其中包含 .r
我正在努力使用 bootstrap4。我导入了 bootstrap.bundle.js,其中已经包含 popper.js。 但无论如何我都会收到以下错误: Uncaught ReferenceErro
最近我在我的 flutter 项目中添加了 Firebase。为了使用 firebase 数据库服务,我添加了 cloud_firebase 包。但是在添加这个包之后,我的应用程序没有运行并且给了我一
自从更新了 sp 软件包后,我收到了以前没有收到的警告: 1: In showSRID(uprojargs, format = "PROJ", multiline = "NO") : Disca
安装 pq_search 并运行 contrib 包迁移后: class InstallSomeContribPackages < ActiveRecord::Migration def up
我有一个包是一个 vuejs 应用程序。如果我使用“npm i 'path/to/app-vuejs --save-dev'”将它安装到我的项目本地,然后运行 npm explore app-vuej
构建 AngularJS 包后,如何使用 NodeJS 作为后端请求服务器来部署 AngularJS 我的项目结构:应用程序/应用程序/配置应用程序/脚本应用程序/样式应用程序/ View 凉亭组件/
这听起来很傻,我敢肯定。开始吧。 我有一个新安装的 Debian Wheezy (Debian7)。我没有使用目前拥有 v5.5.31 的 MySQL 的 aptitude 安装,而是使用 MySQL
在安装 cloud_firestore 软件包后在 iOS 模拟器上运行时,我什至尝试过 pod update Firebase/Firestore 仍然出现以下错误。 即使我多次尝试删除 Podfi
在安装 cloud_firestore 软件包后在 iOS 模拟器上运行时,我什至尝试过 pod update Firebase/Firestore 仍然出现以下错误。 即使我多次尝试删除 Podfi
如果我将 RDF4J 与 Maven(没有 OSGi 容器)一起使用,我就能够利用 RDF4J 提供的所有类。但是当我将 RDF4J 与 OpenDaylight 一起使用时,我使用 RDF4J 类的
当我使用移动应用程序模板创建新的 ASP.NET MVC 4 Web 应用程序时,解决方案可以使用默认代码构建并正常运行(当然)。 Nuget 表示该项目有许多可用的更新。因此,在更新所有这些内容(“
生态系统 using npm@6.1.0 using node@v8.11.1 上下文 我有一个包含本地依赖项的 JS 项目: package.json : "dependencies": {
我是一名优秀的程序员,十分优秀!