Another new C++ 11 feature: constexpr

Danny Kalev wrote this post about constexpr:

constexpr is a new C++11 keyword that rids you of the need to create macros and hardcoded literals. It also guarantees, under certain conditions, that objects undergo static initialization. Danny Kalev shows how to embed constexpr in C++ applications to define constant expressions that might not be so constant otherwise.

The new C++11 keyword constexpr controls the evaluation time of an expression. By enforcing compile-time evaluation of its expression, constexpr lets you define true constant expressions that are crucial for time-critical applications, system programming, templates, and generally speaking, in any code that relies on compile-time constants.

constexpr is not available in Visual Studio 2010 or Visual Studio 2012 (not even with the November CTP).

Leave a comment

Filed under C++

iPad Mini wifi and photo issues

I’ve noticed that my new iPad Mini has occasional wifi connectivity issues. Tablet crunch has several suggestions and resetting the network settings after installing the latest iPad OS upgrade has worked for me.

A separate issue is that photos taken from my iPhone are frequently upside-down when viewed on my PC. Rotating them in Windows Explorer doesn’t work – although they are corrected on the PC, they become inverted once copied onto the iPad. Instead, use Microsoft Pro Photo Tools to rotate the pictures on the PC – this results in correctly oriented photos on both the PC and the iPad.

Another tip is to take iPhone photos with the Square button on the right or bottom – that way, photos won’t need to be rotated at all.

Leave a comment

Filed under Technology

Experimental code for simulating Reflection in C++

Motivation for looking at Reflection in C++

At work, we have two frameworks for developing new components – one in C++ and the other in F#. The F# framework is newer and benefits from the insight of previous years working with the C++ framework. In particular, the new F# framework only requires developers to implement a reduced, strongly typed interface in F# by defining a few types (e.g. records) and associated functions between them. This reduced interface is inflated into a full model by the framework, making heavy use of .NET Reflection.

The F# framework has delivered productivity improvements (development time down to a third compared to the previous C++ framework). But the philosophical question remains – how much of that is due to the new architecture developed with the benefit of hindsight? And could we replicate that architecture in C++? The main functionality gap comes down to this: in F# you can use .NET Reflection to discover the names and types of fields in F# types such as unions, records and options, but in C++ you can’t.

Requirements

A full implementation of Reflection for C++ would include ability to discover type information, field names, properties and methods, as well as being able to create instances of types and invoke methods.  I’m interested in a small subset of that scope – the ability to discover the names and values of fields in a C++ struct.

Solution

#include "stdafx.h"

#include <iostream>
#include <string>

#include <boost\preprocessor.hpp>
#include <boost\preprocessor\variadic\size.hpp>
#include <boost\type_traits.hpp>

#include <boost\mpl\range_c.hpp>
#include <boost\mpl\for_each.hpp>

#define REMOVE_BRACKETS(...) __VA_ARGS__
#define REMOVE_NEXT(x)
#define STRIP_TYPE(x) REMOVE_NEXT x
#define DECLARE_DATA_MEMBER(x) REMOVE_BRACKETS x
#define TYPE_ONLY(x) x REMOVE_NEXT(

#define REFLECTABLE(...) \
  static const int number_of_fields = BOOST_PP_VARIADIC_SIZE(__VA_ARGS__); \
  friend struct Reflector; \
  \
  template<int N, class Parent = void> \
  struct FieldData {}; \
  \
  BOOST_PP_SEQ_FOR_EACH_I(REFLECT_EACH, data, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))

#define REFLECT_EACH(r, data, i, x) \
  DECLARE_DATA_MEMBER(x); \
  template<class Parent> \
  struct FieldData<i, Parent> \
  { \
    Parent & parent; \
    FieldData(Parent& p) : parent(p) {} \
    \
    TYPE_ONLY x ) & get() const \
    { \
      return parent.STRIP_TYPE(x); \
    }\
    const char * name() const \
    {\
      return BOOST_PP_STRINGIZE(STRIP_TYPE(x)); \
    } \
  }; \

struct Reflector
{
  // Get a FieldData instance for the N'th field in type T
  template<int N, class T>
  static typename T::template FieldData<N, T> getFieldData(T& x)
  {
    return typename T::template FieldData<N, T>(x);
  }

  // Reflector is a friend of T, so has access to the private member T::number_of_fields
  template<class T>
  struct FieldCounter
  {
    static const int count = T::number_of_fields;
  };
};

// FieldDispatcher - calls Visitor::visit for each field in T
template<class T, class Visitor>
struct FieldDispatcher
{
  FieldDispatcher( T& t, Visitor visitor ) :
  t(t),
  visitor(visitor)
  {
  }

  template<class FieldIterator>
  void operator()(FieldIterator)
  {
    auto field = Reflector::getFieldData<FieldIterator::value>(t);
    visitor.visit( field );
  }

  T& t;
  Visitor visitor;
};

template<class T, class Visitor>
void for_each_field(T& t, Visitor visitor)
{
  typedef boost::mpl::range_c<int, 0, Reflector::FieldCounter<T>::count> FieldList;
  FieldDispatcher<T, Visitor> field_dispatcher( t, visitor );

  // For each field in T, dispatch the visitor to that field
  boost::mpl::for_each<FieldList>( field_dispatcher );
}

struct PrintNameValueVisitor
{
  template<class FieldData>
  void visit( FieldData field )
  {
    std::cout << field.name() << "=" << field.get() << std::endl;
  }
};

struct Person
{
  Person(const char *first_name, int age, const char* street, const char* town) :
    first_name(first_name),
    age(age),
    street_name(street),
    town(town)
    {
    }

  REFLECTABLE
  (
    (const char *) first_name,
    (int) age,
    (std::string) street_name,
    (std::string) town
  )
};

int _tmain(int argc, _TCHAR* argv[])
{
  Person p("John", 31, "Electric Avenue", "Harrogate" );
  for_each_field(p, PrintNameValueVisitor());

  return 0;
}

Output

Output

Conclusions

The code above ‘works’ – it satisfies the requirements by providing a way to decorate a struct with metadata that can be used to return the names and values of each field. However, in Visual Studio 2010 and 2012, it produces compiler warnings (due to the macro hackery in TYPE_ONLY) and confuses intellisense (which doesn’t cope with the REFLECTABLE macro). In practical terms, that makes it unsuitable, because the productivity benefits are lost when intellisense and auto-complete stop working.

2 Comments

Filed under C++ Code

C++ pre-processor and decltype references

I’m experimenting with the Boost PP library and found these links useful: C Preprocessor, difference between std::result_of and decltype and name lookup tricks (the latter has a handy trick for declaring return types in a template to workaround name lookup phase issues). The question on StackOverflow that promted me to look at Boost PP was reflection in C++

Leave a comment

Filed under C++

Contactless payment on buses

We are now able to pay by cards enabled with NFC – but what are the chances of paying multiple fares?

TfL warned Oyster card users in an email that they should take care when swiping their wallet against readers if they own more than one NFC-enabled card. “If you present two cards together, the reader will normally reject them both,” said TfL. “But there is a small possibility of payment being taken from a card which you did not intend to use.”

Leave a comment

Filed under Technology

iPhone tricks

I recently found out that you can zoom in on an iPhone camera by pinching the picture and you can take a screen shot by pressing Square + Power together:

20121217-131129.jpg

Leave a comment

Filed under Technology

Knight Capital takeover rumours

Knight Capital’s fall from grace was well publicised after a software glitch cost them $440 million. Now there’s talk of a takeover.

Leave a comment

Filed under Finance

Vision of touch typing in the future

This alternative keyboard layout would change the amount of travel each finger has to make in order to touch type. The article doesn’t give any figures as to speeds achieved after practice and to be honest I’m not sure you’d gain much over a mini-QWERTY keyboard.

Leave a comment

Filed under Technology

Brett Victor – A Brief Rant on the future of Interaction Design

Brett Victor makes a convincing case that we shouldn’t sell our futures selves short by settling for a limiting future based on “Pictures under Glass”.

Leave a comment

Filed under Technology

Capture-by-Move for lambdas in C++

Marco Arena looks at how to implement move semantics for lambda captures – useful if you wish to capture a large object without using shared_ptr (perhaps to avoid other parties mutating the object outside the lambda).

John Bandela proposed an alternative approach.

All very interesting, but as the comments suggest, it’s best to introduce an extra parameter to the lambda and use std::bind:

function CreateLambda()
{
  std::vector<Huge> hugeObj;
  // ...preparation of hugeObj...

  auto toReturn = std::bind(
    [](std::vector<Huge>& hugeObj)
    { /*..operate on hugeObj..*/ },
    std::move(hugeObj));

  return toReturn;
}

Leave a comment

Filed under C++