2014-11-18 4 views
0

У меня есть фрагмент кода, который выглядит какC++ автоматическая генерация препроцессор кода

std::string z_A_file("z_A.txt"); 
z_A_file = inputs_folder + z_A_file.c_str(); 
Eigen::Matrix<PRECISION, Eigen::Dynamic, Eigen::Dynamic> z_A_ = readArbitraryMatrix<PRECISION>(z_A_file.c_str()); 
Eigen::VectorXf z_A = z_A_; 
// 
std::string z_B_file("z_B.txt"); 
z_B_file = inputs_folder + z_B_file.c_str(); 
Eigen::Matrix<PRECISION, Eigen::Dynamic, Eigen::Dynamic> z_B_ = readArbitraryMatrix<PRECISION>(z_B_file.c_str()); 
Eigen::VectorXf z_B = z_B_; 

Могу ли я иметь функцию препроцессора так, что я просто пишу

read_vector(A); 
read_vector(B); 

вместо того, чтобы повторять один и тот же код ?

+1

Как-то * Начало * Приходит на ум. И вы могли бы, но какое это было бы? Создайте коллекцию векторов, создайте схему именования, которая соответствует файлам, нарисуйте ее. Бонусные баллы за лямбда. –

+0

Если у вас есть пять или более таких фрагментов, это может стоить проблем. Только для двух, используя предварительный процессор, не стоит терять видимость кода. –

+0

У меня около 100 таких фрагментов :-), поэтому их переписывание может привести к ошибкам. – user1194167

ответ

2

Могу ли я иметь функцию препроцессора так, что я просто пишу

Этот файл:

#define read_vector(x) \ 
std::string z_##x##_file("z_"#x".txt");\ 
z_##x##_file = input_folder + z_##x##_file.cstr();\ 
Eigen::Matrix<PRECISION, Eigen::Dynamic, Eigen::Dynamic> z_##x##_ = readArbitraryMatrix<PRECISION>(z_##x##_file.cstr());\ 
Eigen::VectorXf z_##x = z_##x##_; 

read_vector(A); 
read_vector(B); 

После предварительной обработки: g++ -E main.cpp -o main.pp

стал на:

# 1 "main.cpp" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 1 "<command-line>" 2 
# 1 "main.cpp" 

std::string z_A_file("z_""A"".txt");z_A_file = input_folder + z_A_file.cstr();Eigen::Matrix<PRECISION, Eigen::Dynamic, Eigen::Dynamic> z_A_ = readArbitraryMatrix<PRECISION>(z_A_file.cstr());Eigen::VectorXf z_A = z_A_;; 
std::string z_B_file("z_""B"".txt");z_B_file = input_folder + z_B_file.cstr();Eigen::Matrix<PRECISION, Eigen::Dynamic, Eigen::Dynamic> z_B_ = readArbitraryMatrix<PRECISION>(z_B_file.cstr());Eigen::VectorXf z_B = z_B_;; 

Это то, что вы ожидаете?

+0

Да, но это ужасный код. «Дайте человеку рыбу ...» –

+0

'но это ужасный код, вы совершенно правы! – Gluttton

+1

Лучше иметь уродливый макрос, чем повторять один и тот же параграф кода 100 раз; последний склонен к несогласованности, когда люди обновляют код (поскольку они иногда забывают обновить все 100 экземпляров или испортить один или несколько из 100 утомительных изменений, которые необходимы каждый раз при изменении формулы) –