小编L. *_* F.的帖子

非类型模板参数可以是“ void *”类型吗?

Yakk-Adam Nevraumont

void*在标准的至少某些版本中,不允许使用type的非类型模板参数。

这是真的?如果为真,则在哪些版本的标准中void*不允许使用非类型模板参数?

(注意:正如在 回答 另一个评论的评论中所指出的 ,这是关于非类型模板参数,而不是模板类型参数模板参数可以是每个 [temp.arg.type]的有效type-id,包括。void*

c++ templates language-lawyer c++17 c++20

11
推荐指数
1
解决办法
280
查看次数

clang vs gcc:可变参数lambda捕获

我试图在内部lambda中捕获一个可变参数的lambda参数,并在其中使用它。例如,考虑以下代码:

int main () {
    auto first = [&] (auto&&... one) {
        auto second = [&] (auto&&... two) {
            return ((one * two) + ...);
        };
        return second(one...);
    };
    return first(5);
}
Run Code Online (Sandbox Code Playgroud)

这适用于gcc9,但不适用于clang8(https://godbolt.org/z/i2K9cK)。

使代码编译的一种方法是显式捕获[&one...],但是我想知道这是否是clang中的错误。

也很有趣:将return语句更改one为直接扩展的内容(与结合之前two),然后再次编译: return (((one * ...) * two) + ...);

我找到了这个相关的帖子,但是声明在那里的错误似乎在clang8中已修复。

c++ variadic-templates generic-lambda

11
推荐指数
1
解决办法
226
查看次数

C++中Vector的实现

我最近写了一个STL Vector的实现作为编程练习.该程序编译但我收到一个奇怪的错误说:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Run Code Online (Sandbox Code Playgroud)

我以前从来没有想过这个错误,也不确定在我的实现中究竟应该改变什么才能使它正常运行.

有人可以查看我的代码,看看在这个特定情况下是否有任何东西突然出现错误?对不起,我不能更具体,我不知道在哪里看自己,提前谢谢.

#include <iostream>
#include <string>
#include <cassert>
#include <algorithm>

using namespace std;

template <class T>
class Vector
{
public:

   typedef T * iterator;

   Vector();
   Vector(unsigned int size);
   Vector(unsigned int size, const T & initial);
   Vector(const Vector<T> & v);      
   ~Vector();

   unsigned int capacity() const;
   unsigned int size() const;
   bool empty() const;
   iterator begin();
   iterator end();
   T & front();
   T & back();
   void push_back(const T & value); 
   void pop_back(); …
Run Code Online (Sandbox Code Playgroud)

c++ stl exception vector template-meta-programming

10
推荐指数
2
解决办法
5万
查看次数

C++ 相当于 Java Map getOrDefault?

Java 的 getOrDefault 是一个很好的构造,可以单行访问映射值或起点(如果不存在)。我在 C++ 的地图参考中没有看到任何并行的内容。是否存在某些东西或者是您自己构建的?

我在地图中有对象,如果它们存在,我会更新它们,但如果它们不存在,我会构造新的。使用 getOrDefault,我可以在默认端构造对象,或者访问它(如果存在)。

http://www.cplusplus.com/reference/map/map/

https://www.geeksforgeeks.org/hashmap-getordefaultkey-defaultvalue-method-in-java-with-examples/

c++ treemap c++17

10
推荐指数
1
解决办法
9524
查看次数

在C++中使用'&'符号

我意识到这可能是一个愚蠢的问题,但我无法在任何地方找到答案...... C++函数中'&'符号的目的是什么?如

vec2& operator+(vec2& left, const vec2& right)
{
    return left.add(right);
}
Run Code Online (Sandbox Code Playgroud)

我正在关注一个有点超过我的youtube系列,但我做得很好,因为所有代码都在那里.然而,'和'符号不断涌现,我真的想知道它是什么......它与课程有关吗?

这正是我正在观看的内容:https://www.youtube.com/watch?v = -peYVLeK0WU来自名为"TheChernoProject"的频道制作一个简单的游戏引擎的家伙.此外,这是Visual Studio 2013 C++,如果它改变任何东西.

c++

9
推荐指数
3
解决办法
8978
查看次数

具有主类的C ++正则表达式不匹配

https://en.cppreference.com/w/cpp/regex/regex_traits/transform_primary中,提出了以下示例代码段:

#include <iostream>
#include <regex>

int main()
{
    std::locale::global(std::locale("en_US.UTF-8"));
    std::wstring str = L"AÀÁÂÃÄÅaàáâãäå";
    std::wregex re(L"[[=a=]]*", std::regex::basic);
    std::cout << std::boolalpha << std::regex_match(str, re) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

也有人说应该输出true。但是,始终在Debian上使用GCC 8和Clang 7以及macOS High Sierra随附的Clang进行尝试false(您可以使用cppreference页面中的“运行”按钮直接进行测试)。

有人可能会说cppreference页面是错误的,这肯定是可能的,但是在阅读文档时,对我来说似乎true也是正确的输出:str据我所知,字符串中的所有字符都在的主要整理类中a

所以问题是:谁是对的?编译器还是cppreference?又为什么呢?

c++ regex locale

9
推荐指数
1
解决办法
104
查看次数

FMT C ++库:允许用户为自定义类型设置格式说明符

例如,我有一个自定义类型

struct custom_type
{
    double value;
};
Run Code Online (Sandbox Code Playgroud)

我想为此类型设置自定义FMT格式器。我执行以下操作,并且有效:

namespace fmt
{
    template <>
    struct formatter<custom_type> {
        template <typename ParseContext>
        constexpr auto parse(ParseContext &ctx) {
        return ctx.begin();
    };

    template <typename FormatContext>
    auto format(const custom_type &v, FormatContext &ctx) {
        return format_to(ctx.begin(), "{}", v.value);
    }
};
Run Code Online (Sandbox Code Playgroud)

但是问题是,输出格式是由带有此"{}"表达式的模板代码设置的。我想给用户一个机会自己定义格式字符串。

例如:

custom_type v = 10.0;
std::cout << fmt::format("{}", v) << std::endl;    // 10
std::cout << fmt::format("{:+f}", v) << std::endl; // 10.000000
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

目前,当我设置自定义格式字符串时,

 what():  unknown format specifier
Run Code Online (Sandbox Code Playgroud)

c++ fmt

9
推荐指数
1
解决办法
321
查看次数

iOS键盘交互式解散 - 在用户拉下时获取帧

当你将键盘框架拖离屏幕时,我正在画一个关于如何获得键盘框架的空白.我知道如何使用UIKeyboardWillShowNotification,UIKeyboardWillChangeFrameNotification,UIKeyboardDidChangeFrameNotification开始或结束动画,但是当你将它拖离屏幕时我正在寻找持续更新.例如,我想知道键盘的框架在此拖动点的位置 我在拖动时寻找键盘框架

我正在尝试使用键盘框架来调整桌面视图,该视图应该在向下拖动时正对着键盘.

任何帮助,将不胜感激.

谢谢,

韦斯

keyboard ios

8
推荐指数
0
解决办法
1086
查看次数

Using placement new in generic programming

When using placement new in generic code to construct an object at a specified address, the usage pattern is a bit different from usual code. For example, consider this implementation of uninitialized_copy: ([uninitialized.copy])

template <class It, class For>
For uninitialized_copy(It first, It last, For dest)
{
    using T = typename std::iterator_traits<For>::value_type;
    for (; first != last; ++first, (void)++dest)
        ::new (static_cast<void*>(std::addressof(*dest))) T(*first);
}
Run Code Online (Sandbox Code Playgroud)

This post addresses the following points from the perspective of the standard:

  • why ::new is …

c++ c++-faq generic-programming placement-new language-lawyer

8
推荐指数
1
解决办法
143
查看次数

从属非类型参数包:标准怎么说?

我认为以下代码格式正确:

template< typename T >
using IsSigned = std::enable_if_t< std::is_signed_v< T > >;

template< typename T, IsSigned< T >... >
T myAbs( T val );
Run Code Online (Sandbox Code Playgroud)

其他人则说它格式错误,因为C ++ 17标准的第17.7(8.3)节:

知道哪些名称是类型名称,就可以检查每个模板的语法。该程序格式错误,无需诊断,如果:(...)可变参数模板的每个有效专业化都需要一个空模板参数包,或者(...)

我认为这IsSigned< T >...是一个依赖的模板参数,因此无法在模板定义时对照§17.7(8.3)进行检查。IsSigned< T >例如可能是voidTs的一个子集,int另一个子集或替换失败。对于void子集,确实是这样,空模板参数包将是唯一有效的专业化,但是int子集可以具有许多有效的专业化。这取决于实际T参数。

这意味着编译器必须在模板实例化之后检查它,因为T之前是未知的。到那时,完整的参数列表是已知的,可变参数为零。该标准规定以下内容(第17.6.3(7)节):

当N为零时,扩展的实例化将生成一个空列表。这样的实例化不会改变封闭结构的句法解释

这就是为什么我认为它的格式正确。

  • 你怎么看?
  • 我如何确定这种歧义?这很难决定,因为代码可以编译,但是它什么都没有:§17.7(8.3)是NDR,编译器不必引发任何编译错误。

c++ templates sfinae language-lawyer variadic-templates

8
推荐指数
1
解决办法
134
查看次数