std::is_integral und std::enable_if



  • Eine Klasse von mir nimmt einen Templateparameter. Ich möchte, das nur integrale Typen akzeptiert werden und ansonsten der Compiler schreit.

    #pragma once
    
    #include <cstdlib>
    #include <initializer_list>
    #include <type_traits>
    
    template <typename T>
    typename std::enable_if<std::is_integral<T>::value, void>::type
    class Vector
    {
    public:
    	explicit Vector(std::size_t size) : m_size(size) {}
    	Vector(const std::initializer_list<T> args) {}
    };
    

    Nur wie genau mache ich das syntaktisch?



  • siehe http://www.boost.org/doc/libs/1_55_0/libs/utility/enable_if.html Absatz: "3.2 Enabling template class specializations"


  • Mod

    Ganz anders. Dafür nutzt man static_assert . Das sollte dein Compiler bereitstellen, da du ja auch initializer_list verwendest.

    template <typename T>
    class Vector
    {
    public:
        static_assert( std::is_integral<T>::value, "Fehlermeldung" );
    
        ....
    };
    

    enable_if würde man bei Klassentemplates eher für partielle Spezialisierungen einsetzen.

    Edit: P.S.: enable_if 's zweiter Template-Parameter hat schon void als Default-Argument.


Anmelden zum Antworten