使用模板生成预先计算的数组?
Generate precomputed arrays using templates?
是否有一个好的模式可以让我使用模板从给定的元素类型、所需长度和自定义函数生成预先计算的数组f(int index)
?
考虑这个 C-style 实现。
#define FORLIST_1(fOfi) (fOfi)(0)
#define FORLIST_2(fOfi) FORLIST_1(fOfi) , (fOfi)(1 )
#define FORLIST_3(fOfi) FORLIST_2(fOfi) , (fOfi)(2 )
#define FORLIST_4(fOfi) FORLIST_3(fOfi) , (fOfi)(3 )
//... And so on
// Toy example user-specified function which describes how to create the table
double genEntry(u32 i) {
return i == 0 ? 0 : std::log(i) / std::log(5);
}
// Generate a precomputed lookup table
// FORLIST_15 expands into genEntry(0), genEntry(1), genEntry(2), ...
const double lookupTable[16] = {
FORLIST_16(genEntry)
};
用模板做同样的事情最干净的方法是什么?它必须允许我指定数组中元素的数量,并允许我提供某种用户函数(索引作为参数)。函子、std::function
、lambda、函数指针等,大概都是acceptable定义元素生成器的方式
我可能希望将模板 explicit-instantiate 一次变成 obj/lib 以便 table 本身只被定义一次,作为一个可链接的符号而不是被重新编译到每个包含 header.
的 .cpp 文件
使用可变参数模板,您可以执行如下操作:
template <typename F, std::size_t ... Is>
auto
make_array(F f, std::index_sequence<Is...>)
-> std::array<std::decay_t<decltype(f(0u))>, sizeof...(Is)>
{
return {{f(Is)...}};
}
注意:decay_t
、index_sequence
和 make_index_sequence
是 C++14,但可以用 C++11 编写。
是否有一个好的模式可以让我使用模板从给定的元素类型、所需长度和自定义函数生成预先计算的数组f(int index)
?
考虑这个 C-style 实现。
#define FORLIST_1(fOfi) (fOfi)(0)
#define FORLIST_2(fOfi) FORLIST_1(fOfi) , (fOfi)(1 )
#define FORLIST_3(fOfi) FORLIST_2(fOfi) , (fOfi)(2 )
#define FORLIST_4(fOfi) FORLIST_3(fOfi) , (fOfi)(3 )
//... And so on
// Toy example user-specified function which describes how to create the table
double genEntry(u32 i) {
return i == 0 ? 0 : std::log(i) / std::log(5);
}
// Generate a precomputed lookup table
// FORLIST_15 expands into genEntry(0), genEntry(1), genEntry(2), ...
const double lookupTable[16] = {
FORLIST_16(genEntry)
};
用模板做同样的事情最干净的方法是什么?它必须允许我指定数组中元素的数量,并允许我提供某种用户函数(索引作为参数)。函子、std::function
、lambda、函数指针等,大概都是acceptable定义元素生成器的方式
我可能希望将模板 explicit-instantiate 一次变成 obj/lib 以便 table 本身只被定义一次,作为一个可链接的符号而不是被重新编译到每个包含 header.
的 .cpp 文件使用可变参数模板,您可以执行如下操作:
template <typename F, std::size_t ... Is>
auto
make_array(F f, std::index_sequence<Is...>)
-> std::array<std::decay_t<decltype(f(0u))>, sizeof...(Is)>
{
return {{f(Is)...}};
}
注意:decay_t
、index_sequence
和 make_index_sequence
是 C++14,但可以用 C++11 编写。