Changeset 11002 for code/branches/cpp11_v2/src/libraries/util/MultiType.h
- Timestamp:
- Dec 30, 2015, 9:13:14 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/cpp11_v2/src/libraries/util/MultiType.h
r11001 r11002 183 183 /// Returns the type of the current value. 184 184 inline const Type::Enum& getType() const { return this->type_; } 185 /// Returns true if the type of the stored value is T. 186 template <typename T> inline bool isType() const { return false; } 185 186 /// Returns true if the type of the stored value is T. Note: the actual implementations for all supported types are defined outside of the class. 187 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type 188 inline /*bool*/ isType() const 189 { 190 // If you reach this code, you used MultiType with an unsupported type T 191 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 192 return false; 193 } 194 /// Implementation for enum classes: Returns true if the type of the stored value is the underlying type of T. 195 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type 196 inline /*bool*/ isType() const 197 { 198 return this->isType<typename std::underlying_type<T>::type>(); 199 } 187 200 188 201 /// Checks whether the value is a default one. … … 215 228 virtual bool setValue(const MultiType& other) = 0; 216 229 230 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type 231 inline /*bool*/ setValue(const T& value) 232 { 233 // If you reach this code, you used MultiType with an unsupported type T 234 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 235 return false; 236 } 237 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type 238 inline /*bool*/ setValue(const T& value) 239 { 240 typedef typename std::underlying_type<T>::type UnderlyingType; 241 return this->setValue(reinterpret_cast<const UnderlyingType&>(value)); 242 } 243 217 244 virtual bool getValue(char* value) const = 0; 218 245 virtual bool getValue(unsigned char* value) const = 0; … … 239 266 virtual bool getValue(orxonox::Degree* value) const = 0; 240 267 268 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type 269 inline /*bool*/ getValue(T* value) const 270 { 271 // If you reach this code, you used MultiType with an unsupported type T 272 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 273 return false; 274 } 275 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type 276 inline /*bool*/ getValue(T* value) const 277 { 278 typedef typename std::underlying_type<T>::type UnderlyingType; 279 return this->getValue(reinterpret_cast<UnderlyingType*>(value)); 280 } 281 241 282 template <typename T> T get() const 242 283 { … … 431 472 } 432 473 /// Creates a new value container (works only with specialized types). 433 template <typename T> inline void createNewValueContainer(const T& value) 474 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value>::type 475 inline /*void*/ createNewValueContainer(const T& value) 434 476 { 435 477 // If you reach this code, you used MultiType with an unsupported type T 436 478 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 479 } 480 /// Creates a new value container (implementation for enum classes that must be cast to the underlying type). 481 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value>::type 482 inline /*void*/ createNewValueContainer(const T& value) 483 { 484 typedef typename std::underlying_type<T>::type UnderlyingType; 485 this->createNewValueContainer<UnderlyingType>(reinterpret_cast<const UnderlyingType&>(value)); 437 486 } 438 487
Note: See TracChangeset
for help on using the changeset viewer.