Changeset 11002 for code/branches/cpp11_v2/src/libraries/util
- Timestamp:
- Dec 30, 2015, 9:13:14 PM (9 years ago)
- Location:
- code/branches/cpp11_v2/src/libraries/util
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/cpp11_v2/src/libraries/util/Math.h
r10978 r11002 47 47 #include <cstdlib> 48 48 #include <random> 49 #include <type_traits> 49 50 50 51 #include <OgreMath.h> … … 178 179 @c Vector3 you get <tt>Vector3(0, 0, 0)</tt>. 179 180 */ 180 template <typename T> 181 inline Tzeroise()181 template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, T>::type 182 inline /*T*/ zeroise() 182 183 { 183 184 // If you reach this code, you abused zeroise()! 184 185 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T"); 186 } 187 /// Implementation for enum classes: uses the underlying type to create a zero value. 188 template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, T>::type 189 inline /*T*/ zeroise() 190 { 191 return static_cast<T>(zeroise<typename std::underlying_type<T>::type>()); 185 192 } 186 193 -
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.