User Defined Literals

Namespaces for User-Defined Literals

How do user-defined literals interact with namespaces?

Abstract art representing computer programming

Using namespaces with user-defined literals is a good practice to avoid naming conflicts and organize your code better. Here's how you can effectively use namespaces with user-defined literals:

Defining Literals in a Namespace

You can define user-defined literals inside a namespace to prevent potential naming conflicts with other parts of your code or third-party libraries. For example, let's define some distance literals inside a distance_literals namespace:

#include <iostream>

namespace distance_literals {
  float operator""_mm(long double val) {
    return static_cast<float>(val / 1000);
  }

  float operator""_cm(long double val) {
    return static_cast<float>(val / 100);
  }

  float operator""_m(long double val) {
    return static_cast<float>(val);
  }

  float operator""_km(long double val) {
    return static_cast<float>(val * 1000);
  }
}

int main() {
  using namespace distance_literals;

  float distance = 5.0_km;
  std::cout << distance << " meters";
}
5000 meters

Using the Namespace

To use the literals defined in a namespace, you need to include a using namespace directive in your code. This makes the literals available in the current scope:

using namespace distance_literals;
float d = 3.0_m;

Alternatively, you can qualify the literal with the namespace:

float d = distance_literals::3.0_km;

Benefits of Namespaces

  • Avoid Naming Conflicts: By encapsulating your literals in a namespace, you reduce the risk of naming conflicts with other literals or functions in your project.
  • Organized Code: Grouping related literals within a namespace keeps your code organized and easier to maintain.
  • Scoped Usage: You can control the scope in which the literals are available, making your code more modular and less prone to errors.

Example with Custom Types

Here’s an example with a custom Distance type and namespace:

#include <iostream>

class Distance {
public:
  Distance(float value) : value{value} {}
  float value;
};

namespace distance_literals {
  Distance operator""_meters(long double val) {
    return Distance{static_cast<float>(val)};
  }

  Distance operator""_kilometers(long double val) {
    return Distance{static_cast<float>(val * 1000)};
  }
}

std::ostream& operator<<(std::ostream& os, Distance d) {
  os << d.value << " meters";
  return os;
}

int main() {
  using namespace distance_literals;
  Distance d = 3.0_kilometers;
  std::cout << d;
}
3000 meters

By leveraging namespaces, you can write more modular, organized, and conflict-free code, making it easier to manage and extend.

Answers to questions are automatically generated and may not have been reviewed.

A computer programmer
Part of the course:

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Free, unlimited access

This course includes:

  • 125 Lessons
  • 550+ Code Samples
  • 96% Positive Reviews
  • Regularly Updated
  • Help and FAQ
Free, Unlimited Access

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Screenshot from Warhammer: Total War
Screenshot from Tomb Raider
Screenshot from Jedi: Fallen Order
Contact|Privacy Policy|Terms of Use
Copyright © 2024 - All Rights Reserved