【发布时间】:2014-06-03 12:51:04
【问题描述】:
我想为几个可能的类的几种组合编写基准代码。如果我自己编写每个组合,它就会变成无法维护的混乱。因此,我正在寻找一种通过模板自动组合每种类型的方法,类似于以下伪代码:
for (typename HashFuction : Sha256, Sha512, Sa512_256, Sha3_256, Sha3_512) {
for (typename KeyingWrapper : TwoPassKeyedHash, OnePassKeyedHash, PlainHash) {
for (typename InstantiatedGetLeaf: GetLeaf<8>, GetLeaf<1024>) {
for (typename algorithm : algA, algB, algC) {
runAndTime<HashFunction,KeyingWrapper,
InstantiatedGetLeaf,algorithm>(someArgs);
}
}
}
}
Sha256,... ,TwoPassKeyedHash,... 是类型。
我正在寻找的代码应该在功能上等同于以下内容:
runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<8>,algA>(someArgs);
runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<8>,algB>(someArgs);
runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<8>,algC>(someArgs);
runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<1024>,algA>(someArgs);
runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<1024>,algB>(someArgs);
runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<1024>,algC>(someArgs);
runAndTime<Sha256,OnePassKeyedHash,GetLeaf<8>,algA>(someArgs);
runAndTime<Sha256,OnePassKeyedHash,GetLeaf<8>,algB>(someArgs);
runAndTime<Sha256,OnePassKeyedHash,GetLeaf<8>,algC>(someArgs);
// And 99 further lines…
在 Peregring-lk 的帮助下,我已经走到了这么远
#include <iostream>
template<typename Aux_type>
void test_helper()
{}
template<typename Aux_type, typename Head, typename... Tail>
void test_helper() {
std::cout << Head::i;
test_helper<Aux_type, Tail...>();
}
template<typename... Args>
void test()
{
test_helper<void, Args...>();
}
struct A{
static const int i=1;
};
struct B{
static const int i=2;
};
int main() {
test<A, B>();
return 0;
}
但我还没有看到如何迭代该递归以获得嵌套循环。任何帮助将不胜感激。
(编辑:代码重组并包含 Peregring-lk 的答案。)
【问题讨论】:
-
@AndyT:我没有发现任何有用的东西,但我对 Boost MPL(和一般的 Boost)没有经验,所以我可能忽略了一些东西。
-
使用
mpl::vector和mpl::for_each对其进行迭代。例如:stackoverflow.com/questions/8386494/… -
@AndyT:显然我无法理解如何迭代
for_each来获得嵌套循环。可以举个例子吗?
标签: c++ templates metaprogramming