我有这段代码:
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很大会发生什么.
我需要打印一个类的名称,例如
template<typename... Args>
struct S{};
Run Code Online (Sandbox Code Playgroud)
使用typeid(S<int,std::vector<double>>).name()其相当简单的方法来打印具有代表性的内容。使用boost demangle甚至可以在gcc上读取。
有什么方法可以获取名称,因此不同的编译器之间的名称相同吗?
我有一个类采用几个模板参数:
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作为模板参数传递从同一个基类继承所有,所以我可以加我想有任何静态成员。在c ++ 11中是否有一种标准方法可以使用某些模板黑魔法或使用某些标准库函数动态获取类的名称?
前几天我问了一个关于嵌套向量的非常相似的问题,但我遇到了另一个让我难倒的问题。我需要在编译时获取嵌套向量的最内层类型,以便我可以使用它作为模板参数传递。
例如,如果我有这个嵌套向量:
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) 在 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) 考虑以下示例:
#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++标准是否明确地说明了这一点?
根据typeid(array).name()它是PAN_i在G ++ 4.8.4.我知道P意味着指针和i意味着int,但是什么类型是什么A,为什么只有第二个维度N- 而不是第一个 - M.
我应该输入什么而不是自动输入auto array = new int[M][N]?
是否有分配的方式array来int**?
另一个问题是M和N必须是编译时常量.如果他们不是,我想我唯一的选择是动态C++ 03 2D阵列.
这是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)