我有一个模板函数启用(通过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个不同的功能?
谢谢.
考虑以下关于积分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++ 11 iso标准对这样的表达式说了什么:
class MyClass
{
public:
constexpr int test()
{
return _x;
}
protected:
int _x;
};
Run Code Online (Sandbox Code Playgroud)
_x是a中使用的非常量constexpr:它会产生错误,还是会constexpr被忽略(就像我们传递非const参数时一样)?
我有一个函数,它接受两个与参数大小相同的向量:
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> …
我试图对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)
我想我必须取消之前的定义,但我不知道该怎么做.
所有在标题:确实IEEE-754 float,double并quad保证准确表示-2,-1,-0,0,1,2?
我知道以下,如果可能的话,将是一个绝对不好的做法,但我想知道这是否可行.
问题如下:是否有可能在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)
我知道这是愚蠢的,但这不是问题......
什么是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")
怎么做?
在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.1和clang++ 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++标准多次使用单词适配器:
std::scoped_allocator_adaptor)std::queue,std::priority_queue,std::stack)std::reverse_iterator,std::move_iterator)似乎这个词本身并没有在标准中定义.我认为这个词用于参考设计模式,但似乎在适配器设计模式中,适配器应该只调整接口,而不是行为.
问题:因此我想知道:
请考虑以下代码:
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在测试表达式的正确性时如何使失败.
请考虑以下代码:
#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结尾.任何解释?