C++ 为什么不是';在这里工作时不使用“定义”来隐藏独特的丑?
以下隐藏独特丑陋的“伎俩”有什么错C++ 为什么不是';在这里工作时不使用“定义”来隐藏独特的丑?,c++,visual-c++,c++11,visual-studio-2012,C++,Visual C++,C++11,Visual Studio 2012,以下隐藏独特丑陋的“伎俩”有什么错 class Drawable; typedef unique_ptr<Drawable> pDrawable; #define newDrawable(...) pDrawable(new Drawable (##__VA_ARGS__)) 与 我想翻译成: unique_ptr<Drawable> myDraw = unique_ptr<Drawable>(new Drawable()); unique_ptr myD
class Drawable;
typedef unique_ptr<Drawable> pDrawable;
#define newDrawable(...) pDrawable(new Drawable (##__VA_ARGS__))
与
我想翻译成:
unique_ptr<Drawable> myDraw = unique_ptr<Drawable>(new Drawable());
unique_ptr myDraw=unique_ptr(new Drawable());
但是,如果visual studio没有给出以下错误,我甚至无法编译宏。这就好像《定义》中的某些东西本身是不允许的。错误在我进行定义的行上返回,而不是在调用定义的行上返回
请参见此处,了解为什么make_unique不起作用:
edit2
我已经回答了下面的问题。上面的代码确实可以编译并工作。嗯,#define
是一个很大的问题,因为它不遵守范围规则,而且它们进行简单的文本替换,有时会产生令人惊讶的结果。我认为,当我需要完成某件事时,预处理器宏是最后的手段。
最好定义一个像make_shared
这样的模板,它返回一个唯一的\u ptr
。这是允许的,因为您可以将其移动到位
auto a_drawable = make_unique<Drawable>(a, b, c);
template <typename T, typename... Args>
::std::unique_ptr<T> make_unique(Args&&... args)
{
return ::std::unique_ptr<T>{new T(::std::forward<Args>(args)...)};
}
auto a_drawable=make_unique(a、b、c);
模板
::std::unique_ptr make_unique(Args&&…Args)
{
return::std::unique_ptr{new T(::std::forward)
至于为什么在使用宏时会出现错误,我不确定。看起来你是在某个上下文中使用宏,结果会变成const::std::unique\u ptr&
,然后尝试将其构造成不同的pDrawable
。这行不通。我不知道为什么会发生这种情况。这是错误的epends在使用宏的上下文中起着至关重要的作用,但您没有提供这一点
这突出了我的第一点。宏非常难看的一个原因是,它们是简单的文本替换,其含义可以根据上下文而变化。嗯,#define
是一个巨大的问题,因为它不遵守范围规则,它们进行简单的文本替换,有时会产生令人惊讶的结果我认为当我需要完成某件事时,预处理器宏是最后的手段。
最好定义一个像make_shared
这样的模板,该模板返回一个唯一的\u ptr
。这是允许的,因为您可以将其移动到位
auto a_drawable = make_unique<Drawable>(a, b, c);
template <typename T, typename... Args>
::std::unique_ptr<T> make_unique(Args&&... args)
{
return ::std::unique_ptr<T>{new T(::std::forward<Args>(args)...)};
}
auto a_drawable=make_unique(a、b、c);
模板
::std::unique_ptr make_unique(Args&&…Args)
{
return::std::unique_ptr{new T(::std::forward)
至于为什么在使用宏时会出现错误,我不确定。看起来你是在某个上下文中使用宏,结果会变成const::std::unique\u ptr&
,然后尝试将其构造成不同的pDrawable
。这行不通。我不知道为什么会发生这种情况。这是错误的epends在使用宏的上下文中起着至关重要的作用,但您没有提供这一点
这突出了我的第一点。宏非常难看的一个原因是,它们是简单的文本替换,其含义可以根据上下文而变化。答案:
确保你实际使用了宏,一切都会好起来的
显然,为了验证#define宏,VC++会检查宏的实际使用情况。如果编译的宏没有实际使用情况,VC++会尝试“理解”它,并可能引发编译器错误
神奇的是,如果我加上:
pDrawable myDraw = newDrawable();
在上面的代码之后,错误消失了
很抱歉浪费了大家的时间。至少这激发了我阅读以下文章的灵感:
回答:
确保你实际使用了宏,一切都会好起来的
显然,为了验证#define宏,VC++会检查宏的实际使用情况。如果编译的宏没有实际使用情况,VC++会尝试“理解”它,并可能引发编译器错误
神奇的是,如果我加上:
pDrawable myDraw = newDrawable();
在上面的代码之后,错误消失了
很抱歉浪费了大家的时间。至少这激发了我阅读以下文章的灵感:
您实际如何使用newDrawable()
在一个完整的声明中?你不会写你自己的使_独一无二
?因为诚恳地说,这个宏更难看:/我怀疑你用它来代替使_独一无二
,因为这是一个与使_共享
类似的用例。Herb Sutter有一个使_独一无二的实现示例。这就是使_独一无二的原因如果他们记得将其包含在标准中,则为。请展示一个完整的示例来演示该问题。您实际如何使用newDrawable()
在一个完整的声明中?你不会写你自己的使_独一无二
?因为诚恳地说,这个宏更难看:/我怀疑你用它来代替使_独一无二
,因为这是一个与使_共享
类似的用例。Herb Sutter有一个使_独一无二的实现示例。这就是使_独一无二的原因如果他们记得将其包括在标准中的话,那就是。请给出一个完整的例子来说明这个问题。哦,我很高兴我提出了一个版本的make_unique
几乎与Herb Sutter的版本完全相同,甚至不知道他的版本。这是一个如此简单和明显的功能,尽管这并不奇怪有趣的是,你们两个都忘了处理char[]
@MooingDuck-Oops!笑吧,是的,我们都这么做了。人们分配数组并有一个unique\u ptr
指向他们?!为什么,是谁干的?!chuckleI想不出一个理由也会使用标准的make\u unique
。(人们可能需要C interop与malloc/free进行交互,但不能使用使_唯一
。@MooingDuck-我也想不出原因。unique_ptr
根本不支持操作符[]
。因此真正有用的唯一数组句柄类型是::std::vector
。是的,inter
auto a_drawable = make_unique<Drawable>(a, b, c);
template <typename T, typename... Args>
::std::unique_ptr<T> make_unique(Args&&... args)
{
return ::std::unique_ptr<T>{new T(::std::forward<Args>(args)...)};
}
pDrawable myDraw = newDrawable();