Skip to content

Instantly share code, notes, and snippets.

@mshanak
Last active January 23, 2025 08:18
Show Gist options
  • Select an option

  • Save mshanak/bc3ccb7589faee5d81af61ef44f5e824 to your computer and use it in GitHub Desktop.

Select an option

Save mshanak/bc3ccb7589faee5d81af61ef44f5e824 to your computer and use it in GitHub Desktop.
This C++ code provides a reusable template function parseArgument designed to simplify command-line argument parsing in applications. The function allows users to retrieve and validate parameters of various types (strings, integers, floats) by specifying a parameter name (e.g., --port). It automatically assigns a default value if the parameter i…
#include <iostream>
#include <string>
#include <stdexcept> // For exception handling
template <typename T>
void parseArgument(int argc, char *argv[], const std::string& paramName, T& var, T defaultValue) {
for (int i = 1; i < argc; ++i) {
if (std::string(argv[i]) == paramName) {
if (i + 1 < argc) {
if constexpr (std::is_same<T, std::string>::value) {
var = argv[i + 1];
} else if constexpr (std::is_integral<T>::value) {
try {
var = static_cast<T>(std::stoi(argv[i + 1]));
} catch (const std::invalid_argument& e) {
std::cerr << "Invalid argument for parameter " << paramName << ": " << argv[i + 1] << std::endl;
var = defaultValue;
return;
} catch (const std::out_of_range& e) {
std::cerr << "Value out of range for parameter " << paramName << ": " << argv[i + 1] << std::endl;
var = defaultValue;
return;
}
} else if constexpr (std::is_floating_point<T>::value) {
try {
var = static_cast<T>(std::stof(argv[i + 1]));
} catch (const std::invalid_argument& e) {
std::cerr << "Invalid argument for parameter " << paramName << ": " << argv[i + 1] << std::endl;
var = defaultValue;
return;
} catch (const std::out_of_range& e) {
std::cerr << "Value out of range for parameter " << paramName << ": " << argv[i + 1] << std::endl;
var = defaultValue;
return;
}
} else {
std::cerr << "Unsupported type for parameter: " << paramName << std::endl;
var = defaultValue;
return;
}
return;
} else {
std::cerr << "Missing value for parameter: " << paramName << std::endl;
var = defaultValue;
return;
}
}
}
// Parameter not found, assign default value
var = defaultValue;
}
template <typename T>
void parseArgument(int argc, char *argv[], const std::string& paramName, T& var) {
parseArgument(argc, argv, paramName, var, T());
}
#include <iostream>
#include "./cli_helpers.h"
//Example main function
int main(int argc, char *argv[]) {
//how to use it
//parseArgument(argc, argv, "KEY", variable, default_value);
std::string port,ip;
parseArgument(argc, argv, "--ip", ip, std::string("0.0.0.0"));
parseArgument(argc, argv, "--port", port, std::string("8889"));
int exp_id=0;
parseArgument(argc, argv, "--expirement_id", exp_id, 0);
// Output the values to verify parsing
std::cout << "ip: " << ip << std::endl;
std::cout << "port: " << port << std::endl;
std::cout << "expirement_id: " << exp_id << std::endl;
return 0;
}
@mshanak
Copy link
Author

mshanak commented Jan 23, 2025

This C++ code provides a reusable template function parseArgument designed to simplify command-line argument parsing in applications.
The function allows users to retrieve and validate parameters of various types (strings, integers, floats) by specifying a parameter name (e.g., --port). It automatically assigns a default value if the parameter is missing or invalid, and includes error handling for invalid conversions (e.g., non-numeric input for numeric parameters) and out-of-range values.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment