我有一个这样的功能模板:
template <class ...A>
do_something()
{
// i'd like to do something to each A::var, where var has static storage
}
Run Code Online (Sandbox Code Playgroud)
我不能用Boost.MPL.你能告诉我如何在没有递归的情况下做到这一点吗?
我对此代码段有疑问:
template <typename T>
struct S
{
static int a;
};
template <typename T>
decltype(S<T>::a) S<T>::a;
Run Code Online (Sandbox Code Playgroud)
clang-3.4 说:
s.cpp:8:25: error: redefinition of 'a' with a different type: 'decltype(S<T>::a)' vs 'int'
decltype(S<T>::a) S<T>::a;
^
s.cpp:4:14: note: previous definition is here
static int a;
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
但gcc-4.8.2接受.哪个编译器是对的?我将来应该避免这样的代码吗?
在某些条件下,我想要SFINAE远离类模板的复制构造函数和复制赋值运算符.但是如果我这样做,则会生成默认的复制构造函数和默认赋值运算符.SFINAE基于我作为类模板参数传递的标签完成.问题是,SFINAE仅适用于模板,复制构造函数/赋值运算符不能作为模板.是否存在变通方法?
我有这个程序的问题:
struct A {};
int main()
{
::std::vector< ::std::unique_ptr<A> > v;
::std::cout << ::std::is_copy_constructible<decltype(v)>{} << ::std::endl;
//decltype(v) w(v);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这输出:
1
Run Code Online (Sandbox Code Playgroud)
但是,如果我取消注释注释行,程序将无法编译.您是否认为,标准中的错误是::std::is_copy_constructible<decltype(v)>{}评估true标准中的哪个位置?例如,应该修复元函数,还是容器应该删除它的复制构造函数,如果value_type它不可复制?
编辑:我想我应该澄清为什么这很重要.比如说,你有一个类模板variant,它包含一个用不可复制的实例化的容器类模板value_type.该variant能SFINAE走法是复制的容器,避免编译错误,但因为它从接收信息错误STL,它不能.由于这个问题,我不得不写一个特殊的moving_variant类模板,它只移动,从不复制,而它可能/应该可以有一个variant类模板.
在Hat运算符的 Eigen中是否有现成的函数或方法?这是运算符,返回一个矩阵,模拟与该向量的叉积.我知道,它可以很容易编写,但我想避免它:
Eigen::Vector3d t = // some vector ;
Eigen::Matrix3d t_hat;
t_hat << 0, -t(2), t(1),
t(2), 0, -t(0),
-t(1), t(0), 0;
Run Code Online (Sandbox Code Playgroud) 涉及什么机制,如果返回类型,可以从初始化列表中构造,我没有指定我返回的类型,如:
std::array<int, 3> make_array()
{
return { 1, 2, 3 };
}
Run Code Online (Sandbox Code Playgroud)
代替
std::array<int, 3> make_array()
{
return std::array<int, 3>{ 1, 2, 3 };
}
Run Code Online (Sandbox Code Playgroud)
如果我在没有指定类型的情况下返回初始化列表,是否涉及任何性能损失?我实际上是在返回一个数组,即转换为std::array?
可以std::initializer_list包含引用类型(rvalue和lvalue)吗?或者是否必须使用指针或引用包装器(例如std::ref)?
编辑:
可能需要进一步澄清:
我有一个成员变量,::std::vector<std::function<void()> >我想转发一个lambda对象.这通常可以用emplace_back,但我想在构造函数的初始化列表中完成.唉,正如我所读到的,这将使转发变得不可能.
我用google的nacl编译器编译了一些Qt代码,但是ncval验证器并没有理解它.许多人中的一个例子:
src/corelib/animation/qabstractanimation.cpp:165
Run Code Online (Sandbox Code Playgroud)
这是相关的代码:
#define Q_GLOBAL_STATIC(TYPE, NAME) \
static TYPE *NAME() \
{ \
static TYPE thisVariable; \
static QGlobalStatic<TYPE > thisGlobalStatic(&thisVariable); \
return thisGlobalStatic.pointer; \
}
#ifndef QT_NO_THREAD
Q_GLOBAL_STATIC(QThreadStorage<QUnifiedTimer *>, unifiedTimer)
#endif
Run Code Online (Sandbox Code Playgroud)
编译为:
00000480 <_ZL12unifiedTimerv>:
480: 55 push %ebp
481: 89 e5 mov %esp,%ebp
483: 57 push %edi
484: 56 push %esi
485: 53 push %ebx
486: 83 ec 2c sub $0x2c,%esp
489: c7 04 24 28 00 2e 10 movl $0x102e0028,(%esp)
490: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
494: …Run Code Online (Sandbox Code Playgroud) SSE/AVX寄存器可以被视为整数或浮点BigNums.也就是说,人们可以忽视存在通道.是否有一种简单的方法可以利用这种观点并将这些寄存器单独或组合用作BigNum?我问,因为我从BigNum库中看到的很少,它们几乎普遍存储并对数组进行算术运算,而不是SSE/AVX寄存器.可移植性?
例:
假设您将SSE寄存器的内容存储为a中的键std::set,您可以将这些内容作为BigNum进行比较.
说我有这个功能:
template <typename ...A>
void test(A&& ...a)
{
[=]()
{
};
}
Run Code Online (Sandbox Code Playgroud)
参数包是转发到lambda还是只是按值复制?我担心,因为我必须明确move()或forward()通常,和a...左值.是一个转发/移动它们的元组中介吗?如果是这样,是否有一种简单的方法可以将元组解压缩到参数包中,而不使用索引技巧?