Skip to content

Instantly share code, notes, and snippets.

@anticrisis
Created June 13, 2019 22:13
Show Gist options
  • Save anticrisis/c68f6fd911211295528758511304a9f8 to your computer and use it in GitHub Desktop.
Save anticrisis/c68f6fd911211295528758511304a9f8 to your computer and use it in GitHub Desktop.
c++ equivalent of generic type constraints
// c++11, c++14, c++17
#include <iostream>
#include <type_traits>
using namespace std;
class BaseClass { };
class OtherClass { };
class DerivedClass : BaseClass {};
template <typename T>
typename enable_if_t<is_base_of_v<BaseClass, T>, bool> hasBaseClass(const T& t)
{
return true;
}
template <typename T>
typename enable_if_t<!is_base_of_v<BaseClass, T>, bool> hasBaseClass(const T& t)
{
return false;
}
template <typename T,
typename = enable_if_t<is_base_of_v<BaseClass, T>>>
auto only_defined_for_derived(const T& t)
{
return 42;
}
int main()
{
auto baseClass = BaseClass{};
auto otherClass = OtherClass{};
auto derivedClass = DerivedClass{};
cout << "baseClass: " << hasBaseClass(baseClass) << endl;
cout << "otherClass: " << hasBaseClass(otherClass) << endl;
cout << "derivedClass: " << hasBaseClass(derivedClass) << endl;
auto a = only_defined_for_derived(baseClass);
//auto b = only_defined_for_derived(otherClass); // compiler error, as expected
auto c = only_defined_for_derived(derivedClass);
return 0;
}
/*
Outputs:
baseClass: 1
otherClass: 0
derivedClass: 1
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment