Overloading — enable_if (2)

// Copyright 2014 Andrzej Krzemienski.
// This shows how to use enable_if for controlling
// which function overload to pick based on the compile-time
// properties of the argument type.

#include <cassert>
#include <type_traits>

#define ENABLE_IF(...) \
  typename std::enable_if<__VA_ARGS__::value>::type* = nullptr

template <typename T>
struct optional
  // optional always uninitialized
  explicit operator bool() const { return false; } 
  T value() const { throw int(); }

  template <typename U, ENABLE_IF(std::is_convertible<U, T>)>
  T value_or(U const& v) const
    if (*this)
      return this->value();
      return v;

  template <typename F, ENABLE_IF(!std::is_convertible<F, T>)>
  T value_or(F const& f) const
    if (*this)
      return this->value();
      return f();

int def()
  return -1;

int main()
  optional<int> oi;
  assert (oi.value_or(1) == 1);
  assert (oi.value_or(&def) == -1);

3 Responses to Overloading — enable_if (2)

  1. Vasily says:

    ENABLE_IF must be in fuction arguments not in template arguments.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.