相关疑难解决方法(0)

<chrono>溢出保证

我有这段代码:

auto time_point_a = std::chrono::high_resolution_clock::now();
while (true) {
  auto time_point_b = std::chrono::high_resolution_clock::now();
  auto counter_ms = std::chrono::duration_cast<std::chromo::milliseconds(time_point_b - time_point_a);
  // more code
std::cont << counter_ms.count() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

counter_ms.count()保证始终返回一个有效的价值?有没有count()抛出的机会?如果counter_ms超过其底层整数类型的大小会发生什么(我估计它long long)?我的程序将连续运行几天,我需要知道如果/什么时候counter_msTOO很大会发生什么.

c++ std integer-overflow c++11 c++-chrono

5
推荐指数
1
解决办法
633
查看次数

编译器独立的类名

我需要打印一个类的名称,例如

template<typename... Args>
struct S{};
Run Code Online (Sandbox Code Playgroud)

使用typeid(S<int,std::vector<double>>).name()其相当简单的方法来打印具有代表性的内容。使用boost demangle甚至可以在gcc上读取。

有什么方法可以获取名称,因此不同的编译器之间的名称相同吗?

c++ gcc boost visual-studio c++17

5
推荐指数
1
解决办法
101
查看次数

有没有办法一致地对类型模板参数进行排序?

我有一个类采用几个模板参数:

template<typename... ELEMENTS>
class MyContainer;
Run Code Online (Sandbox Code Playgroud)

根据定义,MyContainer<A, B, C>是与 不同的类型MyContainer<B, A, C>

但在这种情况下,我想避免这种情况:MyContainer<B, A, C>应该被认为与MyContainer<A, B, C>.

所以我认为“忽略”顺序的一种方法是标准化参数的顺序。有一些模板元编程的魔法,将变换<B, A, C>C, A, B><A, B, C>

但我找不到任何方法来实现这一目标。你能想到一个聪明的技巧来实现这一目标吗?

  • ELEMENTS作为模板参数传递从同一个基类继承所有,所以我可以加我想有任何静态成员。
  • 但是我正在处理的代码库没有启用 RTTI,所以我不能使用 typeid(尽管我认为它无论如何都不是 constexpr)。

c++ templates template-meta-programming

5
推荐指数
1
解决办法
101
查看次数

数据类型转换

有没有在C++中的任何功能,将所有的数据类型(double,int,short等),以string

c++ type-conversion

4
推荐指数
1
解决办法
3367
查看次数

c ++ 11中的typeid(T).name()替代?

在c ++ 11中是否有一种标准方法可以使用某些模板黑魔法或使用某些标准库函数动态获取类的名称?

c++ reflection c++11

4
推荐指数
2
解决办法
4418
查看次数

如何在编译时推断嵌套 std::vector 的内部类型?

前几天我问了一个关于嵌套向量的非常相似的问题,但我遇到了另一个让我难倒的问题。我需要在编译时获取嵌套向量的最内层类型,以便我可以使用它作为模板参数传递。

例如,如果我有这个嵌套向量:

std::vector<std::vector<std::vector<int>>> v;
Run Code Online (Sandbox Code Playgroud)

我需要一种提取方法,int以便我可以调用一个函数,该函数采用嵌套向量并处理如下元素:

foo<int>(v);
Run Code Online (Sandbox Code Playgroud)

除了问题是这个函数应该能够处理包含任何类型的任何深度的嵌套向量。当我打电话时,foo我希望为我自动推导出内部类型。

所以也许调用看起来像这样:

foo<inner_type_t<v>>(v);
Run Code Online (Sandbox Code Playgroud)

哪里inner_type_t是某种形式的递归模板,int当给定时解析为v

我认为该解决方案将与另一个问题的解决方案类似,但我无法解决...在递归模板方面,我仍然是一个新手。

编辑:

这是我到目前为止...

template <typename T>
struct inner_type
{
    using type = T;
};

template <typename T>
struct inner_type<std::vector<T>>
{
    using type = inner_type<T>;
};

int main()
{
    std::vector<std::vector<int>> v  = {
        { 1, 2}, {3, 4}
    };

    std::cout << typeid(inner_type<decltype(v)>::type).name();
}
Run Code Online (Sandbox Code Playgroud)

输出:

struct inner_type<class std::vector<int,class std::allocator<int> > >
Run Code Online (Sandbox Code Playgroud)

c++ templates template-meta-programming c++14

4
推荐指数
3
解决办法
291
查看次数

boost pfr 如何获取结构体的字段名称?

在 Boost 1.84 中(目前正在进行中):

大新功能:字段名称反射。添加了新的 constexpr boost::pfr::get_name<N, T>() 函数,该函数返回 std::string_view,其字段名称位于聚合 T 的索引 N 处。需要 C++20。

使用github 上最新版本的 pfr,您可以编写如下代码

#include <boost/pfr/core.hpp>
#include <boost/pfr/core_name.hpp>

struct S
{
    int i = 1;
    double d = 2;
    std::string s = "three";
};

const S s;
constexpr auto names = boost::pfr::names_as_array<S>();
boost::pfr::for_each_field(
    s,
    [&names](const auto& field, std::size_t idx)
    { std::cout << idx << ": " << names[idx] << " = " << field << '\n'; });
Run Code Online (Sandbox Code Playgroud)

输出:

0: i = 1 …
Run Code Online (Sandbox Code Playgroud)

c++ reflection boost c++20

4
推荐指数
1
解决办法
506
查看次数

为什么name()函数返回的字符串是实现定义的?

考虑以下示例:

#include <iostream>
#include <typeinfo>
int main()
{
    int a=9;
    std::cout << typeid(a).name() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

g ++ 4.8.1上的输出:i

MSVS 2010上的输出:int

为什么输出是编译器依赖?这背后的原因是什么?为什么它被保留为实现定义?为什么在所有编译器上没有相同的输出?C++标准是否明确地说明了这一点?

c++ rtti typeid

3
推荐指数
1
解决办法
128
查看次数

new int [M] [N]的类型是什么?

根据typeid(array).name()它是PAN_i在G ++ 4.8.4.我知道P意味着指针和i意味着int,但是什么类型是什么A,为什么只有第二个维度N- 而不是第一个 - M.

我应该输入什么而不是自动输入auto array = new int[M][N]

是否有分配的方式arrayint**

另一个问题是M和N必须是编译时常量.如果他们不是,我想我唯一的选择是动态C++ 03 2D阵列.

c++ arrays dynamic multidimensional-array c++11

3
推荐指数
1
解决办法
560
查看次数

无法理解 std::move 的实现

这是std::move(). 它不完全符合标准的细节,但非常接近:

template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{   
    return ( ( typename std::remove_reference<T>::type&& )Arg );
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这是行不通的,如果我们更换typename std::remove_reference<T>::type&&T&&,即

template<class T>
typename std::remove_reference<T>::type&&
myMove( T&& Arg )
{   
    return ( (T&&) Arg );
}
Run Code Online (Sandbox Code Playgroud)

c++ move-semantics

3
推荐指数
1
解决办法
1493
查看次数