- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以在编译时创建一个键->类型映射,在调用可变参数函数的实例时添加每个键值?
template <typename T, typename ... Args>
void writeToQueue(Args... args) {
//Do something with args.
// Insert to map. something akin to:
// CODEMAP[T] = Args...
// T -> Args... mapped when foo<T,Args...> is called.
}
或者
template <int code, typename ... Args>
void writeToQueue(Args... args) {
//Do something with args.
// Insert to map. something akin to:
// CODEMAP[code] = Args...
// code -> Args... mapped when foo<code,Args...> is called.
}
在上面,要求是有一个映射 type->type 或 int->type(以可行者为准)的 CODEMAP,但是当函数 foo 被调用时映射被填充,所以它不是事先的要求了解代码和参数。
这有可能吗?通过 boost/预处理器/模板编程?
编辑:如前所述,CODEMAP 是存储代码 -> 类型信息的映射。在运行时,读取器 block (比如 R)将读取 foo() 存储/处理的消息,并根据消息开头的代码进行解析。代码总是固定大小(4 个字符或 1 个整数)。
是同一个翻译单元。
编辑:所以这是交易:
生产者:将数据写入 FIFO 队列(关键代码热路径)-> 消费者线程从队列中读取并处理信息。
伪代码如下:
制作人:
void Producer::run() {
// This guy shouldn't worry about the type of data being written.
// So, encapsulating data into structs and passing it to queue is
// out of question.
writeToQueue<Code1>(1,2,"123123",'a', 3.1416);
writeToQueue<Code2>(4,1,'b');
template <int Code, typename ...Args>
void writeToQueue(Args... args) {
queue.insert(args...);
// Need code to args... mapping. So, decided to create static
// instantiation of a formatspecifier class.
static formatspecifier<Code, args...> f{};
}
// To encode the type information to be used in run time.
template <int Code, typename ... Args>
class formatspecifier{
formatspecifier() {
global::codemap[Code] = encodeTypeInfo<Args...>();
}
};
}
消费者:
void Consumer::readfromQueue() {
while(true) {
if (queue.dataAvailable()) {
const auto code = queue.getCode();
// get encoded type info format from global::codemap map.
const auto fmt = global::codemap[code];
for (int i=0; i < fmt.len; i++) {
// I am unsure how this part should look.
process<fmt[0]::type>(queue.getData<fmt[0]::type>());
}
}
}
}
最佳答案
您可以通过 code
模板化结构,而不是使用映射,如下所示:
enum Codes {
BEGIN_CODE = 0,
Code1,
Code2,
NB_CODES
};
template <typename ... Args>
struct param_pack {
// Alternatively you could also use std::tuple?!
};
template <Code code>
struct code_info;
// You still have to manually define this at some point...
// For all your different messages...
template <>
struct code_info<Code1> {
typedef param_pack<int, double, double> args_t;
};
template <>
struct code_info<Code2> {
typedef param_pack<int, float, float, long> args_t;
}
第一步检查,我们在某处有不同消息代码的类型信息。现在,我们如何使用这些信息处理它们?是时候施展一些模板魔法了:
namespace details {
template <typename ArgPack>
struct pack_processor;
template <typename T, typename ... Args>
struct pack_processor<param_pack<T, Args...>> {
static void process_pack(YourQueue& queue) {
process<T>(queue.getData<T>());
pack_processor<param_pack<Args...>>::process_pack(queue);
}
};
template <typename T>
struct pack_processor<param_pack<T>> {
static void process_pack(YourQueue& queue) {
process<T>(queue.getData<T>());
}
};
} // namespace details
template <Code code>
process_message(YourQueue& queue) {
details::pack_processor<typename code_info<code>::args_t>::process_pack(queue);
}
然后你可以添加另一个模板来找到相关的处理步骤,根据消息的代码应用于你的队列......为此我们必须“作弊”一点:因为我们只能在运行时获得所需的代码,我们不能立即分支处理,我们需要使用“模板切换”技巧。如下图所示:
namespace details {
// This is not static:
// you can't have static polymorphism when you get information from runtime...
template <Code ref_code>
void process_data_with_code(Code code, YourQueue& queue) {
// We found the good code:
if (code == ref_code) {
// We retrieve the static information
// and run the appropriate process_pack specialization -> this is static
process_message<ref_code>(queue);
} else {
process_data_with_code<static_cast<Code>(ref_code-1)>(code, queue);
}
}
template <>
void process_data_for_code<BEGIN_CODE>(Code code, YourQueue& queue) {
std::cout << "Code not found..." << std::endl;
}
} // namespace details
void process_data(Code code, YourQueue& queue) {
process_data_for_code<static_cast<Code>(NB_CODE-1)>(code, queue);
}
您可以在 Coliru 上找到运行示例使用虚拟 YourQueue
和 process()
实现。
这解决了消费者部分。您可以通过在 pack_processor
特化和通用 writeToQueue
方法中添加相关方法来类似地解决生产者部分,该方法将使用相同类型的 Template Switch我们刚刚看到的技巧。
关于c++ - 创建一个编译时键到类型映射,通过调用可变参数函数来填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38564365/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!