Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 限制C++;将模板转换为基本类型_C++_Templates - Fatal编程技术网

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

C++ 限制C++;将模板转换为基本类型,c++,templates,C++,Templates,我有一个类,它基本上是一个围绕double的包装器,允许将其值强制为静态值: class ModelParameter { protected: double val; bool isForced; double forcedVal; public: ModelParameter(void); ModelParameter(double value); double getValue

我有一个类,它基本上是一个围绕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);
};
但我希望能够将它用于任何基本类型,而不仅仅是双重类型。如果我这样重新定义它:

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);
};
模板
类模型参数
{
受保护的:
T值;
布尔是被迫的;
T-forcedVal;
公众:
模型参数(void);
模型参数(T值);
T getValue(void);
无效设定值(T值);
bool-getIsForced(无效);
空隙力值(T值);
无效值(void);
};
这意味着可以使用任何类型,无论它是否为基元类型。有没有办法限制模板中使用的类型仅使用基元类型?

(注意:需要C++11)

#包括
模板
类模型参数
{
静态断言(std::is_basical::value,“错误消息”);
...
};

但是为什么要这样做呢?

一种方法是为您想要的类型显式实例化。将所有实现移到.cpp文件中,并为这些类型实例化:

.cpp文件:

...

Definitions and implementation

....

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

...
。。。
定义和实施
....
类模型参数;
类模型参数;
...

然后,它只适用于这些类型。

你可以从这里借用一些想法:你可以使用模板专门化这将用于航天器模拟,其中一个要求是模型中的所有参数都必须是强制的,以便可以轻松地模拟故障(例如,将测量温度强制为零或将太阳能电池阵列的展开角度强制为固定值)。这些参数都是基元类型,因此我想限制模板中使用的类型。此外,我使用std::is_算术而不是std::is_基本,因为我不想允许void和nullptr_types@aero117:因此,您不希望允许某人使用扩展数字类型,如1024位浮点或un有界有理数?
...

Definitions and implementation

....

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

...