Last active
January 23, 2025 08:18
-
-
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…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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()); | |
| } | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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; | |
| } |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.