将C++模板限制为基本类型

roz*_*zzy 7 c++ templates

我有一个类,它基本上是一个double的包装器,允许它的值被强制为静态值:

class ModelParameter
{
    protected:
        double val;
        bool isForced;
        double forcedVal;

    public:
        ModelParameter(void);
        ModelParameter(double value);
        double getValue(void);
        void setValue(double value);
        bool getIsForced(void);
        void forceValue(double value);
        void unforceValue(void);
};
Run Code Online (Sandbox Code Playgroud)

但我希望能够将它用于任何原始类型,而不仅仅是双打.如果我像这样重新定义它:

template <class T>
class ModelParameter
{
    protected:
        T val;
        bool isForced;
        T forcedVal;

    public:
        ModelParameter(void);
        ModelParameter(T value);
        T getValue(void);
        void setValue(T value);
        bool getIsForced(void);
        void forceValue(T value);
        void unforceValue(void);
};
Run Code Online (Sandbox Code Playgroud)

这意味着可以使用任何类型,无论它是否是原始的.有没有什么办法可以限制模板中使用的类型只使用原始类型?

Ben*_*ley 16

(注意:需要C++ 11)

#include <type_traits>

template <class T>
class ModelParameter
{
    static_assert(std::is_fundamental<T>::value, "error message");
    ...
};
Run Code Online (Sandbox Code Playgroud)

但是你为什么要这样做呢?


mas*_*oud 6

一种方法是针对您的预期类型进行显式实例化.将所有实现移动到.cpp文件中并为这些类型实例化:

.cpp文件:

...

Definitions and implementation

....

class ModelParameter<float>;
class ModelParameter<int>;

...
Run Code Online (Sandbox Code Playgroud)

然后,它适用于那些类型.