c++templatesconditional-statementsif-constexpr

How to instantiate only part of a function template if a condition is true


Is it possible to build only some part of the code given the type of the template in C++ ? It would be something lake that :

#include <iostream>

using namespace std;

template<typename T>
void printType(T param)
{
    #if T == char*
        cout << "char*" << endl;
    #elif T == int
        cout << "int" << endl;
    #else
        cout << "???" << endl;
    #endif
}

int main()
{
    printType("Hello world!");
    printType(1);
    return 0;
}

Solution

  • Since C++17 there is a way to do exactly this with if-constexpr. The following compiles since clang-3.9.1, gcc-7.1.0, and recent MSVC compiler 19.11.25506 handles well too with an option /std:c++17.

    #include <iostream>
    #include <type_traits>
    
    template<typename T>
    void printType(T)
    {
        if constexpr (std::is_same_v<T, const char*>)
            std::cout << "const char*" << std::endl;
        else if constexpr (std::is_same_v<T, int>)
            std::cout << "int" << std::endl;
        else
            std::cout << "???" << std::endl;
    }
    
    int main()
    {
        printType("Hello world!");
        printType(1);
        printType(1.1);
        return 0;
    }
    

    Output:

    const char*
    int
    ???