123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- //
- // MetaProgramming.h
- //
- // Library: Foundation
- // Package: Core
- // Module: MetaProgramming
- //
- // Common definitions useful for Meta Template Programming
- //
- // Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #ifndef Foundation_MetaProgramming_INCLUDED
- #define Foundation_MetaProgramming_INCLUDED
- #include "Poco/Foundation.h"
- namespace Poco {
- template <typename T>
- struct IsReference
- /// Use this struct to determine if a template type is a reference.
- {
- enum
- {
- VALUE = 0
- };
- };
- template <typename T>
- struct IsReference<T&>
- {
- enum
- {
- VALUE = 1
- };
- };
- template <typename T>
- struct IsReference<const T&>
- {
- enum
- {
- VALUE = 1
- };
- };
- template <typename T>
- struct IsConst
- /// Use this struct to determine if a template type is a const type.
- {
- enum
- {
- VALUE = 0
- };
- };
- template <typename T>
- struct IsConst<const T&>
- {
- enum
- {
- VALUE = 1
- };
- };
- template <typename T>
- struct IsConst<const T>
- {
- enum
- {
- VALUE = 1
- };
- };
- template <typename T, int i>
- struct IsConst<const T[i]>
- /// Specialization for const char arrays
- {
- enum
- {
- VALUE = 1
- };
- };
- template <typename T>
- struct TypeWrapper
- /// Use the type wrapper if you want to decouple constness and references from template types.
- {
- typedef T TYPE;
- typedef const T CONSTTYPE;
- typedef T& REFTYPE;
- typedef const T& CONSTREFTYPE;
- };
- template <typename T>
- struct TypeWrapper<const T>
- {
- typedef T TYPE;
- typedef const T CONSTTYPE;
- typedef T& REFTYPE;
- typedef const T& CONSTREFTYPE;
- };
- template <typename T>
- struct TypeWrapper<const T&>
- {
- typedef T TYPE;
- typedef const T CONSTTYPE;
- typedef T& REFTYPE;
- typedef const T& CONSTREFTYPE;
- };
- template <typename T>
- struct TypeWrapper<T&>
- {
- typedef T TYPE;
- typedef const T CONSTTYPE;
- typedef T& REFTYPE;
- typedef const T& CONSTREFTYPE;
- };
- } // namespace Poco
- #endif // Foundation_MetaProgramming_INCLUDED
|