相关疑难解决方法(0)

C++结构初始化

是否可以在C++中初始化结构,如下所示

struct address {
    int street_no;
    char *street_name;
    char *city;
    char *prov;
    char *postal_code;
};
address temp_address =
    { .city = "Hamilton", .prov = "Ontario" };
Run Code Online (Sandbox Code Playgroud)

这里这里的链接提到可以仅在C中使用此样式.如果是这样,为什么在C++中这是不可能的?是否有任何潜在的技术原因导致它没有在C++中实现,或者使用这种风格是不好的做法.我喜欢使用这种初始化方式,因为我的结构很大,这种风格让我清楚地看到了为哪个成员分配了什么值.

如果有其他方法可以达到相同的可读性,请与我分享.

在发布此问题之前,我已经提到了以下链接

  1. C/C++ for AIX
  2. C变量的结构初始化
  3. 使用C++中的标记进行静态结构初始化
  4. C++ 11正确的结构初始化

c++

259
推荐指数
10
解决办法
44万
查看次数

C++预处理器:避免代码重复成员变量列表

我有一个多个类,每个类都有不同的成员变量,这些变量在构造函数中被简单地初始化.这是一个例子:

struct Person
{
    Person(const char *name, int age)
        :
        name(name),
        age(age)
    {
    }
private:
    const char *name;
    int age;
};
Run Code Online (Sandbox Code Playgroud)

每个都有一个相关的print<>()功能.

template <>
void print<Person>(const Person &person)
{
    std::cout << "name=" << name << "\n";
    std::cout << "age=" << age << "\n";
}
Run Code Online (Sandbox Code Playgroud)

由于参数列表在四个位置复制,因此该代码容易出错.如何重写代码以避免重复?我想使用预处理器和/或模板.

例如,我可以使用X-args预处理器技术 - 类似这样的东西吗?

#define ARGUMENTS \
    ARG(const char *, name) \
    ARG(int, age)

struct Person
{
    Person(LIST_TYPE_NAME_COMMA(ARGUMENTS))
       :
       LIST_NAME_INIT(ARGUMENTS)
    {
    }
private:
    LIST_TYPE_NAME_SEMICOLON(ARGUMENTS)
};

template <>
void print<Person>(const Person &person)
{
   LIST_COUT_LINE(ARGUMENTS)
} …
Run Code Online (Sandbox Code Playgroud)

c++ templates arguments c-preprocessor

60
推荐指数
2
解决办法
3万
查看次数

将C++异常映射到Result

我正在编写一个Rust库,它是C++库的包装器.

这是C++方面:

#define Result(type,name) typedef struct { type value; const char* message; } name

extern "C" 
{
    Result(double, ResultDouble);

    ResultDouble myFunc() 
    {
        try
        {
            return ResultDouble{value: cv::someOpenCvMethod(), message: nullptr};
        }
        catch( cv::Exception& e )
        {
            const char* err_msg = e.what();
            return ResultDouble{value: 0, message: err_msg};
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和相应的Rust方面:

#[repr(C)]
struct CResult<T> {
    value: T,
    message: *mut c_char,
}

extern "C" {
    fn myFunc() -> CResult<c_double>;
}

pub fn my_func() -> Result<f64, Cow<'static, str>> {
    let result = unsafe { …
Run Code Online (Sandbox Code Playgroud)

c++ opencv ffi rust

4
推荐指数
1
解决办法
190
查看次数

标签 统计

c++ ×3

arguments ×1

c-preprocessor ×1

ffi ×1

opencv ×1

rust ×1

templates ×1