Comments (2)
Not easily with an enum. Remember that an enum is basically an integer, and you are trying to switch the return type based on the integer value sent into it. You'd have to make the enum members actually different classes to properly switch in this way, that way they can be correctly overridden to give you the right return value:
#include <iostream>
#include <string>
template <typename T>
class eSetting {
};
eSetting<bool> flagA;
eSetting<bool> flagB;
eSetting<bool> flagC;
eSetting<std::string> valueFlagA;
eSetting<std::string> valueFlagB;
eSetting<int> valueFlagC;
template <typename T>
T function(const eSetting<T> &flag) {
std::cout << "This is the default value" << std::endl;
return T();
}
template <>
bool function<bool>(const eSetting<bool> &flag) {
std::cout << "This is the overridden boolean value" << std::endl;
return true;
}
int main(int argc, char **argv)
{
function(flagA);
function(flagC);
function(valueFlagA);
function(valueFlagC);
return 0;
}
If you actually need an enum, it might be a bit more difficult. You can not encode that kind of type information on an enum, but you could use template specialization to switch directly based on the enum members, though you might need another template struct to switch correctly on the type at compile time, but it ends up looking quite unpleasant:
#include <iostream>
#include <string>
struct Foo {
// Enum declaration
enum class eSetting {
flagA,
flabB,
flagC,
valueFlagA, // str
valueFlagB, // str
valueFlagC // int
};
// Return type specializations. This acts as a compile-time map to map
// enum values to their return types
template <eSetting Setting>
struct eSettingTypes {};
// Set up get function specializations
template <eSetting Setting>
typename eSettingTypes<Setting>::type get();
};
template <>
struct Foo::eSettingTypes<Foo::eSetting::flagA> {
typedef bool type;
};
template <>
struct Foo::eSettingTypes<Foo::eSetting::valueFlagA> {
typedef std::string type;
};
template<>
bool Foo::get<Foo::eSetting::flagA>() {
std::cout << "flagA" << std::endl;
return true;
}
template<>
std::string Foo::get<Foo::eSetting::valueFlagA>() {
std::cout << "valueFlagA" << std::endl;
return "";
}
int main(int argc, char **argv)
{
Foo foo;
foo.get<Foo::eSetting::flagA>();
foo.get<Foo::eSetting::valueFlagA>();
return 0;
}
This also would force you to create a specialization of both the type structure and the get function for each setting.
from args.
Awesome ! The first one seems to be perfect for my use case ;) Thank you so much.
from args.
Related Issues (20)
- Doesn't save error messages properly when built with `ARGS_NOEXCEPT` HOT 6
- pkg-config file is broken when CMAKE_INSTALL_{INCLUDE,LIB}DIR is absolute HOT 1
- find_package(args REQUIRED) doesn't set args_VERSION HOT 3
- [6.4.3 regression] Installs pkgconfig into the root HOT 3
- Regression: Help string lists `{OPTIONS}` after positional arguments HOT 4
- Detect console/terminal width HOT 2
- 6.4.5: Tests fail HOT 1
- configure of a client project fails: An argument named "TRUE" appears in a conditional statement. HOT 1
- cmake doesn't define args_INCLUDE_DIRS HOT 2
- How to parse keyword-based arguments? HOT 1
- Supplying the same argument twice doesn't cause error HOT 1
- Missing argument doesn't throw exception HOT 1
- Setting default value for arguments HOT 2
- From where did you obtained catch.hpp HOT 2
- Cannot pass negative values to NargsValueFlag<double> HOT 3
- short options not parsed when longprefix is empty HOT 2
- -v flag seems to trigger an args::Help exception HOT 5
- Tag 2.6.4 has PATCH = 3 in args.hxx HOT 1
- use dd-style fail to get '\' in linux HOT 3
- Parse arguments from single string. HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from args.