Stxxl Vector 作为 std::vector 的替代品
Stxxl Vector as dropin replacement for std::vector
这是 的后续。
我希望能够调用带有 std::vector
或 stxxl:vector
的方法,同时指定 vector
(x,y 对)的模板参数。
具体来说,方法 signatrue 可能如下所示:
template<typename t_x, typename t_y,
template<typename, typename> class t_pair,
template<typename...> class t_vector>
method(t_vector<t_pair<t_x,t_y>> &v)
不幸的是,当像这样指定签名时,无法将 stxxl:vector
作为 t_vector
传递。它会导致以下编译错误:
sad.hpp:128:5: note: template argument deduction/substitution failed:
program.cpp:104:52: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class t_vector’
method(coordinates);
^
program.cpp:104:52: error: expected a type, got ‘4u’
program.cpp:104:52: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class t_vector’
program.cpp:104:52: error: expected a type, got ‘2097152u’
问题是如何修改方法签名,以便能够使用 stxxl::vector
作为使用 std::vector
的现有代码的直接替换?
更新为什么我为矢量使用嵌套模板:
我可能弄错了,但我希望编译器为上述方法中的变量类型。
例如,我正在构建 vector
或 queue
std::vector<t_x> intervals(k * k + 1);
typedef std::tuple<std::pair<t_x,t_y>,std::pair<t_x,t_y>, std::pair<t_x,t_y>, uint> t_queue;
std::queue <t_queue> queue;
哪个应该是 uint32_t or uint64_t
取决于对元素的类型是 uint32_t or uint64_t
问题是 stxxl::vector
有非类型模板参数:
BlockSize
external block size in bytes, default is 2 MiB
所以它无法与 template <typename... >
匹配。
在这种情况下你不应该使用模板模板参数,这样会更好(我认为):
template <typename t_vector>
void method (t_vector &v) {
typedef typename t_vector::value_type::first_type t_x;
typedef typename t_vector::value_type::second_type t_y;
// or in c++11 and above
typedef decltype(v[0].first) t_xd;
typedef decltype(v[0].second) t_yd;
}
在上面,您可以使用以下方式检索 t_x
和 t_y
:
value_type
这是所有 Container
都应该有的东西(std::vector
和 stxxl::vector
都有);
decltype
直接从表达式 v[0].first
获取类型(即使 v
为空也有效,因为 decltype
中的表达式永远不会被计算)。
根据我的经验,最好使用非常通用的模板参数,然后从中检索信息(value_type
、decltype
、...),而不是试图限制模板参数本身具有给定的类型。
这是
我希望能够调用带有 std::vector
或 stxxl:vector
的方法,同时指定 vector
(x,y 对)的模板参数。
具体来说,方法 signatrue 可能如下所示:
template<typename t_x, typename t_y,
template<typename, typename> class t_pair,
template<typename...> class t_vector>
method(t_vector<t_pair<t_x,t_y>> &v)
不幸的是,当像这样指定签名时,无法将 stxxl:vector
作为 t_vector
传递。它会导致以下编译错误:
sad.hpp:128:5: note: template argument deduction/substitution failed:
program.cpp:104:52: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class t_vector’
method(coordinates);
^
program.cpp:104:52: error: expected a type, got ‘4u’
program.cpp:104:52: error: type/value mismatch at argument 1 in template parameter list for ‘template<class ...> class t_vector’
program.cpp:104:52: error: expected a type, got ‘2097152u’
问题是如何修改方法签名,以便能够使用 stxxl::vector
作为使用 std::vector
的现有代码的直接替换?
更新为什么我为矢量使用嵌套模板: 我可能弄错了,但我希望编译器为上述方法中的变量类型。
例如,我正在构建 vector
或 queue
std::vector<t_x> intervals(k * k + 1);
typedef std::tuple<std::pair<t_x,t_y>,std::pair<t_x,t_y>, std::pair<t_x,t_y>, uint> t_queue;
std::queue <t_queue> queue;
哪个应该是 uint32_t or uint64_t
取决于对元素的类型是 uint32_t or uint64_t
问题是 stxxl::vector
有非类型模板参数:
BlockSize
external block size in bytes, default is 2 MiB
所以它无法与 template <typename... >
匹配。
在这种情况下你不应该使用模板模板参数,这样会更好(我认为):
template <typename t_vector>
void method (t_vector &v) {
typedef typename t_vector::value_type::first_type t_x;
typedef typename t_vector::value_type::second_type t_y;
// or in c++11 and above
typedef decltype(v[0].first) t_xd;
typedef decltype(v[0].second) t_yd;
}
在上面,您可以使用以下方式检索 t_x
和 t_y
:
value_type
这是所有Container
都应该有的东西(std::vector
和stxxl::vector
都有);decltype
直接从表达式v[0].first
获取类型(即使v
为空也有效,因为decltype
中的表达式永远不会被计算)。
根据我的经验,最好使用非常通用的模板参数,然后从中检索信息(value_type
、decltype
、...),而不是试图限制模板参数本身具有给定的类型。