我有以下代码:
template <const char *p>
struct A{};
template <int i>
struct E{};
extern constexpr int i = 0;
constexpr float f = 0.f;
extern constexpr char c = 0;
int main(int argc, const char *argv[])
{
A<&c> b; //works
A<(const char *)(&i)> a; //Error: could not convert template argument ‘(const char*)(& i)’ to ‘const char*’
E<(int)f> e; //works
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么这条线A<(const char *)(&i)> a;错了?我用g ++ - 4.6.1用-std = c ++ 0x编译它.
编辑:正如Charles建议reinterpret_cast在常量表达式中不允许的那样,我将上面的代码更改为以下代码:
struct Base{};
struct …Run Code Online (Sandbox Code Playgroud) 我实际上在考虑类似于python中的'*'运算符,如下所示:
args = [1,2,4]
f(*args)
Run Code Online (Sandbox Code Playgroud)
在C++中是否有类似的解决方案?
我能想到的是如下:
template <size_t num_args, typename FuncType>
struct unpack_caller;
template <typename FuncType>
struct unpack_caller<3>
{
void operator () (FuncType &f, std::vector<int> &args){
f(args[0], args[1], args[3])
}
};
Run Code Online (Sandbox Code Playgroud)
上面我假设只有int参数类型.
问题是我觉得将unpack_caller的所有特化都写成不同的值是一件麻烦事num_args.
对此有什么好的解决方案?谢谢.
我deque::insert()从C++标准2003(第23.2.1.3章)中了解到如下复杂性:
在最坏的情况下,将单个元素插入到双端队列中需要时间在从插入点到双端队列开始的距离的最小值以及从插入点到双端队列结束的距离的线性.
我总是将stl deque的实现理解为内存块的集合.因此,插入仅影响与插入位置相同的存储块中的元素.我的问题是,标准是什么意思是"从插入点到双端队列开始的距离的最小值和从插入点到双端队列结束的距离的线性"?
我的理解是因为C++标准没有强制实施deque的某种实现.对于最坏的情况,复杂性通常是一般的.但是,在编译器的实际实现中,它与内存块中的元素数量成线性关系,这可能因不同的元素大小而异.
另一个猜测可能是,因为insert()将使所有迭代器无效,deque需要更新所有迭代器.因此它是线性的.
我不确定我是否已正确描述了这个问题,但目前我正在通过以下方式解决这个问题
QUOTEDSTR := "hello world"
NORMALSTR := $(shell echo $(QUOTEDSTR))
Run Code Online (Sandbox Code Playgroud)
是否有更多的内置方式'make'可以在不调用shell的情况下执行此操作?谢谢
之间的关系const_multi_array_ref,multi_array_ref并且multi_array是如下:
multi_array_ref 源于 const_multi_array_refmulti_array 源于 multi_arry_ref然而,的析构函数const_multi_array_ref和multi_array_ref有非虚.实际上,它们没有明确实现的析构函数.只有multi_array一个.这是否意味着不推荐以下用法?
multi_array_ref<float, 2> * = new multi_array<float, 2>(extents[3][3]);
Run Code Online (Sandbox Code Playgroud)
如果是这样,为什么?