Should I use an object or type as trait?
Yes, the std way of doing things in C++ would be to provide static member functions of your traits type. Consider:

// declaration - empty
template &lt;typename SETTINGS&gt;
struct SettingsTraits;

// specialization for type CFoo
template &lt;&gt;
struct SettingsTraits&lt;CFoo&gt;
{
  typedef CFooRelated RelatedType;
  static CAttribute&lt;RelatedType&gt;&amp; GetAttrFrom(CDataSource&amp; ds) { return ds.GetFooAttr(); }
};

// specialization for type CBar    
template &lt;&gt;
struct SettingsTraits&lt;CBar&gt;
{
  typedef CBarRelated RelatedType;
  static CAttribute&lt;RelatedType&gt;&amp; GetAttrFrom(CDataSource&amp; ds) { return ds.GetBarAttr(); }
};

typedef SettingsTraits&lt;SETTINGS&gt; TRAITS;
CAttribute&lt;TRAITS::RelatedType&gt; attr = TRAITS::GetAttrFrom(datasource);


Notice that this way of doing things doesn't involve global objects or values at all; it's all done entirely within the type system. The compiler can look at the line TRAITS::GetAttrFrom(datasource) and statically know that it's equivalent to datasource.GetFooAttr(), which means the whole thing compiles down to a single call instruction. Your old code would have required a trip to memory in order to load the value of the pointer SettingsTraits&lt;CFoo&gt;::GetAttr.

Rule of thumb: you should never need to construct a type-traits object at all. If you do, you're probably doing it wrong.