> C ++在没有给出类型的情况下,自动将void指针转换为C ++中的类型指针(#define)(C

嗨!

我使用了下面的C宏,但是在C ++中它不能自动将void*type*

#define MALLOC_SAFE(var, size) { 
    var = malloc(size); 
    if (!var) goto error; 
}

我知道,我可以做这样的事情:

#define MALLOC_SAFE_CPP(var, type, size) { 
    var = (type)malloc(size); 
    if (!var) goto error; 
}

但我不想重写MALLOC_SAFE被使用的大部分代码。

有没有办法做到这一点,而不需要将类型赋予宏? 也许一些MSVC 2005 #pragma / __declspec / other?

ps:我不能使用C编译器,因为我的代码是大型项目的一部分(数百个模块之一)。 现在它在C ++上。 我知道,我可以单独构建我的代码。 但它是旧代码,我只想快速移植它。

问题是关于void * casting;)如果这是不可能的,我将用MACRO_SAFE_CPP替换MACRO_SAFE

谢谢!


我不建议这样做; 这是可怕的代码,如果你使用C,你应该用C编译器编译它(或者,在Visual C ++中,作为C文件)

如果您使用的是Visual C ++,则可以使用decltype

#define MALLOC_SAFE(var, size)                      
{                                                   
    var = static_cast<decltype(var)>(malloc(size)); 
    if (!var) goto error;                           
}

为了让詹姆斯的答案更加肮脏,如果你没有decltype支持,你也可以这样做:

template <typename T>
class auto_cast_wrapper
{
public:
    template <typename R>
    friend auto_cast_wrapper<R> auto_cast(const R& x);

    template <typename U>
    operator U()
    {
        return static_cast<U>(mX);
    }

private:
    auto_cast_wrapper(const T& x) :
    mX(x)
    {}

    auto_cast_wrapper(const auto_cast_wrapper& other) :
    mX(other.mX)
    {}

    // non-assignable
    auto_cast_wrapper& operator=(const auto_cast_wrapper&);

    const T& mX;
};

template <typename R>
auto_cast_wrapper<R> auto_cast(const R& x)
{
    return auto_cast_wrapper<R>(x);
}

然后:

#define MALLOC_SAFE(var, size)                      
{                                                   
    var = auto_cast(malloc(size));                  
    if (!var) goto error;                           
}

我在我的博客上扩展了这个实用工具(在C ++ 11中)。 除了邪恶之外,不要使用它。


例如,像这样:

template <class T>
void malloc_safe_impl(T** p, size_t size)
{
    *p = static_cast<T*>(malloc(size));
}

#define MALLOC_SAFE(var, size) { 
    malloc_safe_impl(&var, size); 
    if (!var) goto error; 
}
链接地址: http://www.djcxy.com/p/72927.html

上一篇: >C++ Automatically cast void pointer into Type pointer in C++ in #define in case of type is not given (C

下一篇: Dynamic memory allocation in C++ class