c++ - 在编译时选择 size_t 和 container::size_type

标签 c++ c++11 visual-studio-2012 typetraits size-type

我想在代码块中选择数据类型时更加迂腐,我需要在 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_tcontainer::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/

相关文章:

c++ - 无法获得箭头键的正确值

c++ - 内部 lambda 中的悬空引用

c++ - 快速跨平台 C/C++ 图像处理库

c++ - Linux Pybind11 'build check -j 4' 错误

java - 简单 HelloWorld 程序的 JNI : Getting java. lang.UnsatisfiedLinkError

c++ - 为什么不区分大小写与 std::unordered_set 的 std::hash 函数一起使用?

c++ - 为什么 std::async 比简单的分离线程慢?

Windows 8 凭据提供程序 : Linking RFID to an account

xaml - 如何在 Windows 8 中的 Metro 应用程序中创建菜单项

c# - 我可以通过命令提示符提供给 C# 程序的最大输入长度是多少?