2010-08-02 42 views
18

Tôi muốn xuất một số dữ liệu vào một tệp. Ví dụ giả sử tôi có hai vectơ của đôi:chuyển đổi tên biến thành chuỗi trong C++

vector<double> data1(10); 
vector<double> data2(10); 

là có một cách dễ dàng để sản lượng này vào một tập tin để hàng đầu tiên chứa các tiêu đề 'data1' và 'data2' tiếp theo là nội dung thực tế. Chức năng mà xuất ra dữ liệu sẽ được truyền qua các mảng khác nhau để mã hóa tên của tiêu đề là không thể - lý tưởng tôi muốn chuyển đổi tên biến thành một số chuỗi và sau đó xuất chuỗi đó theo sau bởi nội dung của mảng vectơ. Tuy nhiên, tôi không chắc chắn làm thế nào để chuyển đổi tên biến 'data1' thành một chuỗi, hoặc thực sự nếu nó có thể dễ dàng được thực hiện (từ đọc các diễn đàn tôi đoán là nó không thể) Nếu điều này là không thể thay thế có thể sử dụng vùng chứa liên kết như bản đồ hoặc có lẽ chỉ đơn giản là vùng chứa 'cặp'.

pair<vector<double>,string> data1(10,'data1'); 

Bất kỳ đề xuất nào đều được hoan nghênh!

+0

tôi phải tự hỏi những gì bạn đang cố gắng để đạt được. Nếu đó là số lượng dữ liệu tùy ý, đặt tên mỗi phần của nó sẽ không làm bạn bất kỳ điều gì tốt, bởi vì nó phải được thực hiện bằng tay anyway. Giải pháp thứ hai của bạn có lẽ là giải pháp bạn đang tìm kiếm. – data

+0

http://stackoverflow.com/questions/201593/is-there-a-simple-way-to-convert-c-enum-to-string –

Trả lời

30

Bạn có thể sử dụng tiền xử lý "stringify" # để làm những gì bạn muốn:

#include <stdio.h> 

#define PRINTER(name) printer(#name, (name)) 

void printer(char *name, int value) { 
    printf("name: %s\tvalue: %d\n", name, value); 
} 

int main (int argc, char* argv[]) { 
    int foo = 0; 
    int bar = 1; 

    PRINTER(foo); 
    PRINTER(bar); 

    return 0; 
} 


name: foo value: 0 
name: bar value: 1 

(Xin lỗi vì printf, tôi không bao giờ có được hang của <iostream> Nhưng điều này nên là đủ..)

+2

điều này có thể giúp -> http://gcc.gnu.org/onlinedocs/cpp/Stringification.html – KedarX

2

Bạn có thể sử dụng bộ tiền xử lý, có một mã thông báo xâu chuỗi, nhưng nó chỉ có sẵn từ nguồn, chứ không phải từ một hàm (bạn sẽ nhận được tên đối số).

1

Tôi đã nghĩ câu trả lời rõ ràng là làm cho hàm thực hiện đầu ra lấy văn bản tiêu đề dưới dạng tham số chuỗi.

+0

Lý tưởng nhất tôi muốn có thể gọi hàm đó đầu ra không có tham số chuỗi chứa tên của các biến thể varialbes. – Wawel100

+0

@ Wawel100: Không thể. – Puppy

-3

Wow, đây là một chút trickey, một điều bạn có thể cố gắng làm là làm cho các lớp hoặc cấu trúc, trong đó có một yếu tố đó là chuỗi 'tên'.

1

Hơi chuyển thể từ câu trả lời @ sarnold của, cho C++:

#define DEBUG(x) std::cout << #x << " = " << x << std::endl; 

Một chương trình ví dụ trong đó sử dụng này:

int main() { 
    int foo = 1; 
    DEBUG(foo); 

    return 0; 
} 
0

tôi đã cùng một vấn đề. Sau một chút thử nghiệm, tôi đã tạo ra các macro sau để chuyển đổi tên biến, trường, hàm, phương thức và kiểu thành chuỗi.

#define MACRO_VARIABLE_TO_STRING(Variable) (void(Variable),#Variable) 

#define MACRO_FUNCTION_TO_STRING(Function) (void(&Function),#Function) 

#define MACRO_METHOD_TO_STRING(ClassName,Method) (void(&ClassName::Method),#Method) 

#define MACRO_TYPE_TO_STRING(Type) (void(sizeof(Type)),#Type) 

Mã sử ​​dụng toán tử dấu phẩy và chuyển đổi void để buộc trình biên dịch kiểm tra xem biến, chức năng, v.v. có tồn tại hay không. Điều tốt đẹp là nó hoạt động tốt với các biến chưa được khởi tạo. Tôi đã thử nghiệm nó trên cả VC và GCC với tất cả các tùy chọn theo nghĩa đen mà tôi phát hiện ra mà không có bất kỳ thông điệp cảnh báo nào.

int GetAndPrintValue(const char* VariableName) 
{ 
    std::cout << VariableName << std::endl; 
    return 10; 
} 

int Variable=GetAndPrintValue(MACRO_VARIABLE_TO_STRING(Variable)); 

tôi sử dụng mã như vậy khi tôi viết phân tích cú pháp mà đọc dữ liệu từ input stream và nếu biến phân tích cú pháp là ngoài giới hạn nó ném một ngoại lệ với tên của biến mà không kiểm tra tính hợp lệ của tôi.

4

thử điều này:

#define GET_VARIABLE_NAME(Variable) (#Variable) 

// trong các chức năng

int var=0;  
char* var_name= GET_VARIABLE_NAME(var); 
0

Đối với trường hợp này tôi đã thực hiện nameof() vĩ mô. Nó trả về một tên std :: string của một biến, kiểu hoặc thành viên. Nó hoạt động như nameof() trong C#.

Ví dụ:

#include "nameof.h" 

std::vector<double> data1(10); 
std::string name = nameof(data1); // "data1" 

struct Foo1 
{ 
    struct Foo2 
    { 
     Foo1* foo1; 
    }; 

    Foo1* foo1; 
    Foo2 foo2; 
}; 

name = nameof(Foo1::foo1->foo2.foo1); // "foo1" 

name = nameof(123); // std::logic_error exception 
Các vấn đề liên quan