我想在代码块中选择数据类型时更加迂腐,我需要在 size_type
size_t
之间进行选择general 或 container::size_type
用于容器类型。我的问题是,如果我有以下代码块,我不知道该怎么做。有人可以帮忙吗?
template<typename some_container>
int func(some_container& input)
{
//Some code...
//...
decltype(input.size()) variable_x; //Choose this if defined,
size_t variable_x; //otherwise choose this
//... Some more code...
}
在这种情况下,some_container
可能是一个自定义容器,并且不提供size()
函数。促使我产生这种想法的是在 size_t vs container::size_type 阅读 size_t
和 container::size_type
之间的区别。 .我还读了Determine if a type is an STL container at compile time ,但对于我的情况来说,这种方法感觉有点笨拙。
最佳答案
您使用 decltype
的方法是正确的,诀窍是使用 SFINAE,使用模板类或函数重载可以轻松完成。我将展示函数方式,因为它在 C++11 中非常简单:
// One helper per size_type source
template <typename T>
auto size_type_alt(T const& t) -> decltype(t.size());
auto size_type_alt(...) -> std::size_t;
// The switch between helpers
template <typename T>
auto size_type_switch() -> decltype(size_type_alt(std::declval<T>{}));
// And syntactic sugar
template <typename T>
using size_type = decltype(size_type_switch<T>());
用法:
template <typename T>
void some_algorithm(T const& t) {
size_type<T> const size = 0;
// ...
}
注意:开关和糖衣层可以混合在一起,但我认为您可能会喜欢分开查看这些步骤。
关于c++ - 在编译时选择 size_t 和 container::size_type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12997600/