我一直在尝试霍华德的约会库.有很多例子可以获取自某一天午夜以来的秒数,但不是自该日所属的星期开始以来的秒数.按照示例我生成了这段代码:
using timepoint_t = std::chrono::time_point<
std::chrono::system_clock,
std::chrono::nanoseconds
>;
timepoint_t tp; // input
auto dp = std::chrono::floor<date::weeks>(tp); // output, should point to start of week?
Run Code Online (Sandbox Code Playgroud)
但结果是错误的.例如,tp:
2018-10-25T11:26:00.397836134Z
Run Code Online (Sandbox Code Playgroud)
会产生dp:
2018-10-25T00:00:00.000000000Z
Run Code Online (Sandbox Code Playgroud)
这是25日午夜,而不是21日午夜.产生正确输出的最直接方法是什么?
我正在尝试这样做:
struct A
{
virtual int f() const { return 0; }
};
template <typename T>
struct B : A
{
template <typename U = T,
typename std::enable_if<...some condition involving U...>::type>
int f() const { return 1; }
};
Run Code Online (Sandbox Code Playgroud)
警告,我不能继承类模板(使用静态覆盖).是否允许这种构造,模板成员B :: f()是否可以覆盖成员A :: f()?
有像这样的网站:
http://www.cplusplus.com/reference/unordered_map/unordered_map/
这就是说,一个可以提供一个函数指针,而不是一类,对于Hash与Pred该参数的std::unordered_map类模板.但是,没有示例,如果可能的话,我还没有设法让这个功能起作用.非工作的例子:
bool unordered_eq(const char* const s1, const char* const s2)
{
return !std::strcmp(s1, s2);
}
std::size_t unordered_hash(char const* s)
{
return std::hash<std::string>()(s);
}
std::unordered_map<char const*, std::string,
unordered_hash, unordered_eq> hashmap;
Run Code Online (Sandbox Code Playgroud) 我偶尔会想出这样的代码:
// lazy lambda:
[&] {
// use references to a, b, c
}
// pedantic lambda
[&a, &b, &c] {
// use references to a, b, c
}
Run Code Online (Sandbox Code Playgroud)
我想知道根据C++ 14标准(或更高版本)和编译器的实际经验,哪些lambda在性能和可执行大小方面更好.
之前已经多次讨论过这个问题.如果需要,该怎么办:
struct Node
{
::std::vector<Node> nodes_;
};
Run Code Online (Sandbox Code Playgroud)
从这里可以得到一个印象,即(智能)指针Node*可能是规范的解决方案.这意味着一些额外的间接性和相应的性能损失.从这里,我们看到,它libstdc++支持::std::vector<T>实例化,其中T是一个不完整的类型,但不是libc++.这很难携带.但是一个解决方案可能是::std::vector支持不完整类型的便携式外观容器.最后,我们可以做到:
template <::std::size_t I = 0>
struct Node
{
::std::vector<Node<I + 1> > nodes_;
};
template <>
struct Node<20>
{
};
Run Code Online (Sandbox Code Playgroud)
这对我们的图/树施加了限制.是否存在其他解决方法,因为a Node包含Nodes,但在声明时是不完整的类型 ::std::vector<Node> nodes_;?
之前已经提出过类似的问题,但我仍然感到困惑.我相信STL只是通过值传递,因为通过引用传递可能会在多线程环境中产生影响.比如说,当两个或多个线程正在执行一个可变的lambda时.当我只想调用lambda时,我目前使用通用引用:
template <typename F>
inline void invoke(F&& f)
{
f();
}
Run Code Online (Sandbox Code Playgroud)
这会绑定到任何函数对象,就像一个const&愿望,但也许这对于内联来说是一个坏主意.复制传递的lambda更容易由编译器内联吗?我希望通过的lambdas尽可能"无法忍受".
标准的习惯用法似乎是创建n = std::thread::hardware_concurrency()线程并将它们放入线程池中。但是主线程与其他线程一样,因此我们可能只创建n - 1线程并将主线程视为线程池的一部分并节省一些资源。有什么理由不应该这样做吗?
默认的构造函数由C++编译器生成,用户无法控制它们.他们可以扔吗?是否可以指定noexcept何时声明?
以下代码编译得很好gcc.
struct A
{
A() = default;
};
struct B
{
B() noexcept = default;
};
int main()
{
A a;
B b;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我想创建一个我可以用作模板参数的字符串文字.它将编译器抛入某种无限循环.有什么问题并修复?
template <char...> struct slit { };
template <typename ...A>
constexpr auto make_slit(char const* const s, A const ...args)
{
return *s ? make_slit(s + 1, *s, args...) : slit<args...>();
}
int main()
{
auto const tmp_(make_slit("slit"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
强制性错误(带clang++ -std=c++1y):
t.cpp:4:16: fatal error: recursive template instantiation exceeded maximum depth of 256
constexpr auto make_slit(char const* const s, A const ...args)
^
t.cpp:6:15: note: in instantiation of function template specialization 'make_slit<char, char, char, char, char, char, char, …Run Code Online (Sandbox Code Playgroud) 的一个优点any了variant就是,一个不需要指定所有类型,它可能含有.我注意到,随着a类型的数量variant增加,人们倾向于any在某个时候切换,因为他们根本不再跟踪所有类型.我想之间的混合any,并variant有可能.一个可以存储" placeholder"(通过放置new)的any中aligned_storage,与在所计算的大小constexpr被存储,其可以最终功能或模板元函数,从最大的类型的样本,.另一方面,用户不需要指定any可能包含的所有类型.该any还可以扔在任何时候,如果用户将尝试存储的东西比大aligned_storage在那里.
这样的" variant_any"类是否存在?这个想法有一些固有的问题吗?