小编Vin*_*ent的帖子

&*表示原始指针,迭代器和... std :: nullptr_t

我有一个模板函数启用(通过std :: enable_if)它的参数是一个原始指针,或者有一个std :: iterator类或者是一个std :: nullptr_t.在该函数中,原始指针(数据成员)设置为等于参数,如下所示:

template<class T> void myFunction(T it) 
{
    _ptr = &*it;
}
Run Code Online (Sandbox Code Playgroud)

&*适用于指针和迭代器......但它对于std :: nullptr_t失败了.是否有任何解决方案可以避免编写2个不同的功能?

谢谢.

c++ pointers reference nullptr

0
推荐指数
1
解决办法
273
查看次数

功能模板部分特化的解决方法?

考虑以下关于积分pow的元函数(这只是一个例子):

class Meta
{
    template<int N, typename T> static constexpr T ipow(T x)
    {
        return (N > 0) ? (x*ipow<N-1>(x)) 
                       : ((N < 0) ? (static_cast<T>(1)/ipow<N>(x)) 
                                  : (1))
    }
};
Run Code Online (Sandbox Code Playgroud)

如何为这样的函数写停止条件?

c++ templates metaprogramming partial-specialization c++11

0
推荐指数
2
解决办法
1485
查看次数

constexpr中使用的非常量:标准说什么?

C++ 11 iso标准对这样的表达式说了什么:

class MyClass
{
    public:
        constexpr int test()
        {
            return _x;
        }

    protected:
        int _x;
};
Run Code Online (Sandbox Code Playgroud)

_x是a中使用的非常量constexpr:它会产生错误,还是会constexpr被忽略(就像我们传递非const参数时一样)?

c++ standards-compliance constexpr c++11

0
推荐指数
1
解决办法
114
查看次数

如何将重载运算符应用于此?

如何在C++中调用类的另一个成员函数中的重载运算符?

c++ operator-overloading this-pointer

0
推荐指数
1
解决办法
93
查看次数

std :: sort来排序数组和索引列表?

我有一个函数,它接受两个与参数大小相同的向量:

void mysort(std::vector<double>& data, std::vector<unsigned int>& index)
{
   // For example :
   // The data vector contains : 9.8 1.2 10.5 -4.3
   // The index vector contains : 0 1 2 3
   // The goal is to obtain for the data : -4.3 1.2 9.8 10.5
   // The goal is to obtain for the index : 3 1 0 2
   // Using std::sort and minimizing copies
}
Run Code Online (Sandbox Code Playgroud)

如何解决最小化所需副本数量的问题?

一种显而易见的方法是制作单个矢量std::pair<double, unsigned int>并指定比较器[](std::pair<double, unsigned int> x, std::pair<double, unsigned int> …

c++ sorting algorithm c++11

0
推荐指数
1
解决办法
2599
查看次数

在C中取消定义类似函数的宏?

我试图对glibc做一些破解,我想知道是否有可能重新定义类似函数的宏?

例如,<tgmath.h>有以下宏:

#define expm1(Val) __TGMATH_UNARY_REAL_ONLY (Val, expm1)
Run Code Online (Sandbox Code Playgroud)

如何重新定义expm1为:

#define expm1(Val) __TGMATH_UNARY_REAL_IMAG (Val, expm1, cexpm1)
Run Code Online (Sandbox Code Playgroud)

我想我必须取消之前的定义,但我不知道该怎么做.

c macros glibc c-preprocessor

0
推荐指数
1
解决办法
1999
查看次数

0
推荐指数
1
解决办法
1507
查看次数

算术运算有空吗?

我知道以下,如果可能的话,将是一个绝对不好的做法,但我想知道这是否可行.

问题如下:是否有可能在C++中(并且在某种程度上编译器不会抛出任何警告),使用返回void的函数执行无用的算术运算.

std::vector<int> v;
int i = 42 + v.resize(42); 
/* How to transform the last line to execute resize and to have i = 42 */
Run Code Online (Sandbox Code Playgroud)

我知道这是愚蠢的,但这不是问题......

c++ arithmetic-expressions void c++11

0
推荐指数
2
解决办法
149
查看次数

Python 正则表达式:返回包含给定子字符串的单词列表

什么是f基于正则表达式的函数,给定输入文本和字符串,返回文本中包含该字符串的所有单词。例如:

f("This is just a simple text to test some basic things", "si")
Run Code Online (Sandbox Code Playgroud)

会返回:

["simple", "basic"]
Run Code Online (Sandbox Code Playgroud)

(因为这两个词包含子串"si"

怎么做?

python regex string

0
推荐指数
2
解决办法
5134
查看次数

理解clang在汇编中做了什么,递减递增的循环

在C++中考虑以下代码:

#include <cstdlib>

std::size_t count(std::size_t n)
{
    std::size_t i = 0;
    while (i < n) {
        asm volatile("": : :"memory");
        ++i;
    }
    return i;
}

int main(int argc, char* argv[])
{
    return count(argc > 1 ? std::atoll(argv[1]) : 1);
}
Run Code Online (Sandbox Code Playgroud)

它只是一个递增其值的循环,并在最后返回它.所述asm volatile防止环路它被优化.我们编译下g++ 8.1clang++ 5.0与争论-Wall -Wextra -std=c++11 -g -O3.

现在,如果我们看一下编译器资源管理器正在生成什么,我们有g++:

count(unsigned long):
  mov rax, rdi
  test rdi, rdi
  je .L2
  xor edx, edx
.L3:
  add rdx, 1
  cmp rax, …
Run Code Online (Sandbox Code Playgroud)

c++ assembly increment compiler-optimization clang++

0
推荐指数
1
解决办法
100
查看次数

什么是C++标准中的适配器?它与适配器设计模式有何关系?

C++标准多次使用单词适配器:

  • 分配器适配器(std::scoped_allocator_adaptor)
  • 容器适配器(std::queue,std::priority_queue,std::stack)
  • 迭代器适配器(std::reverse_iterator,std::move_iterator)

似乎这个词本身并没有在标准中定义.我认为这个词用于参考设计模式,但似乎在适配器设计模式中,适配器应该只调整接口,而不是行为.

问题:因此我想知道:

  • C++标准中适配器的近似定义是什么?
  • 它是否与适配器设计模式相对应?
  • 如果没有,那么与C++标准(适配器,代理,外观,装饰器......)中的适配器最匹配的设计模式是什么?

c++ standards design-patterns adapter c++-standard-library

0
推荐指数
1
解决办法
168
查看次数

检查表达式是否编译包括所有隐式转换

请考虑以下代码:

void f(auto& i, auto& j)
{
    static_assert(/* SOMETHING */, "");
    // function body here...
}
Run Code Online (Sandbox Code Playgroud)

我希望该/* SOMETHING */部件检查以下代码是否编译(考虑所有标准规则,如隐式转换规则):

i += j;
Run Code Online (Sandbox Code Playgroud)

我试过了:

sizeof(std::declval<decltype(i)>() += std::declval<decltype(j)>());
Run Code Online (Sandbox Code Playgroud)

但它失败了.

这样做的正确方法是什么?

编辑:我了解SFINAE和约束模板参数.这不是问题的主题.主题是static_assert在测试表达式的正确性时如何使失败.

c++ static-assert compile-time implicit-conversion c++11

-1
推荐指数
1
解决办法
83
查看次数

为什么对于有符号整数,i*= 2似乎收敛为0?

请考虑以下代码:

#include <iostream>
int main(int argc, char* argv[])
{
    int i = /* something */;
    for (std::size_t n = 0; n < 100; ++n) {
        i *= 2;
        std::cout << i << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

对有符号整数进行溢出是未定义的行为.但是,我不明白为什么这段代码似乎总是以0结尾.任何解释?

c++ integer integer-overflow

-2
推荐指数
1
解决办法
99
查看次数