使用typename = enable_if_t<...>和enable_if_t<...,bool> = true用于 SFINAE之间有什么区别吗?我特别问,因为我偶然发现了一个错误:编译器错误,在 enable_if_t 中有一个折叠表达式
所以我很好奇两者之间是否有任何实际差异。
是否有一个编译时表达式可以在对象构造函数中复制数组?默认构造函数使用什么?我想要这样的东西:
struct A
{
int arr[100];
// I want something like this:
A(const A& arg) : arr{arg.arr...} {}
// what I use at the moment (a compile time loop):
A(const A& arg)
{
static_for<0, N>([&](auto i) { arr[i] = arg.arr[i]; });
}
};
Run Code Online (Sandbox Code Playgroud)
我不想使用std::array,并且复制ctor中有一些调试信息,因此我不能依赖默认值。
这是不使用折叠来评估参数包的唯一方法(因为它需要使用运算符)吗?
#include <iostream>
template<int ...Is, typename Function>
void eval(Function&& f)
{
// (f(Is)...);
auto op = [&f](int i){f(i); return 0;};
auto doNothing = [](auto...){};
doNothing(op(Is)...);
}
int main()
{
eval<0,1,2>([](int x){std::cout << x << "\n";});
}
Run Code Online (Sandbox Code Playgroud)
本质上,我想这样做(f(Is)...),但是由于某些原因,这在C ++中是不允许的。是否有比使用上述解决方法更优雅的方法?
我想以下片段的行为应该是未定义的,但我只是想确保我理解正确的事情.假设我们有这个代码:
#include <iostream>
int main()
{
std::cout << "mamut" - 8 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因此,我认为这样做是(字符*)((INT)(为const char*) - (INT)),但在此之后的输出是非常奇怪的,不是我期望它做任何真正意义上的.所以我的问题是关于char*和int之间的转换 - 它是未定义的,还是背后有一些逻辑?
编辑:我只想补充一点:
#include <iostream>
int main ()
{
const char* a = "mamut";
int b = int(a);
std::cout << b << std::endl;
std::cout << &a <<std::endl;
// seems b!= &a
for( int i = 0; i<100;i++)
{
std::cout<<(const char*)((int)a - i)<<std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我变得足够大之后的输出给了我像_Jv_RegisterClasses等的东西.仅仅为了记录:
std::cout << a - i << std::endl;
Run Code Online (Sandbox Code Playgroud)
产生与以下相同的结果:
std::cout<<(const char*)((int)a - i)<<std::endl;
Run Code Online (Sandbox Code Playgroud) 我不知道我做错了什么,但我有一张地图:
std::map<std::pair<ID, ID>, std::queue<Datum>> readQueues;
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到我打电话readQueues[std::make_pair(src, dst)];,然后我得到一个错误,我的参数与函数的参数不匹配。有趣的是,整个事情的作品与std::map::find和map::at使用完全相同的参数...任何想法?
是否有一个特征返回特定类的基类,并假定不涉及多重继承?基本上像这样:
struct Base
{
};
struct Derived : public Base
{
};
struct DerivedDerived : public Derived
{
};
static_assert(std::is_same_v<base<DerivedDerived>::type,Derived>);
static_assert(std::is_same_v<base<Derived>::type,Base>);
static_assert(std::is_same_v<base<Base>::type,Base>);
// with levels
static_assert(std::is_same_v<base<0,DerivedDerived>::type,Base>);
static_assert(std::is_same_v<base<1,DerivedDerived>::type,Derived>);
static_assert(std::is_same_v<base<2,DerivedDerived>::type,DerivedDerived>);
static_assert(std::is_same_v<base<0,Derived>::type,Base>);
static_assert(std::is_same_v<base<1,Derived>::type,Derived>);
Run Code Online (Sandbox Code Playgroud)