how to select a code path for different type in a member template function

c++, templates

Solution

You have two classic possibilities.

First, use two global function overloads, one for `ComponentDc`, one for `ComponentIc`:

void globalExec(ComponentDc) { std::cout << "Hello"; }
void globalExec(ComponentIc) { std::cout << "World"; }

void Device<Component>::exec() { globalExec(Component); }

Second, use traits-class: pure template class with no fields and with different typedefs and only static functions as methods. This class has own specializations for different possible argument types.

template<Component> class DeviceTraits {};

template<> class DeviceTraits<ComponentDc> { 
    static std::string getMessage() { return "Hello"; }
};

template<> class DeviceTraits<ComponentIc> { 
    static std::string getMessage() { return "World"; }
};

void Device<Component>::exec() { 
    std::cout << DeviceTraits<Component>::getMessage(); 
}

The advantage of using traits classes is that you don't have to spoil your global namespace with several functions.

About partially specializing the `Device` class itself - it is not always possible, and it is considered more convenient to move any template-argument-specific code into traits class.

This is the classic approach used in STL. Alternatively, you can use `boost::enable_if` or `std::enable_if` (for the latest compilers).

Problem

I have a class which returns the specific device based on runtime. ``` struct ComponentDc; struct ComponentIc; typedef Device<ComponentDc> DevComponentDc; typedef Device<ComponentIc> DevComponentIc; template<class Component> class Device{ Device<Component>* getDevice() { return this; } void exec() { } }; ``` In `exec()`, I'd like to print "Hello" if the component type is `ComponentDc` and world if it is `ComponentIc`. Also, these are the only two types with which Device can be created. How do I do this ?

Original source

Related problems