我可以在模板中使用类型参数作为非类型参数吗?

时间:2018-02-21 18:03:36

标签: c++ templates parameters non-type

我希望有一个合格的类默认初始化,即使构造函数没有参数。

因此,我试图通过尝试类似下面的内容来设置模板定义的默认值。在编译时初始化参数(如果没有给出):

template < class Param_t, Param_t def >
class cParameter
{
public:
    cParameter( Param_t p = def)
        : m_Value(p)
    {}
    Param_t m_Value;
};

这不起作用:-( 附录:......双打或花车。它适用于整数。

原因是我希望用尽可能少的更改替换遗留代码中的结构元素

typedef struct 
{
    int someVariable;
    float someOtherVariable;
} myStructure_t;

到此

typedef struct 
{
    cParameter<int> someVariable;
    cParameter<float> someOtherVariable;
} myStructure_t;

在普通类

中初始化此结构时
class myClass
{
public:
    myClass()
    : m_Struct()
    {}
    myStructure_t m_Struct;
}

当模板没有默认初始化时,我收到错误(MSVC2013):

template < class Param_t >
class cParameter
{
public:
    cParameter( Param_t p )
        : m_Value(p)
    {}
    Param_t m_Value;
};
  

错误42错误C2512:'myClass :: m_Struct':没有合适的默认值   构造函数可用demo.cpp

我还看到了以下内容:

cParameter< int, 1> m_Works;
cParameter< double, 1.0> m_DontWork;

==&GT;以上对我来说很清楚。我刚刚在这里找到了答案stackoverflow.com/questions/2183087 / ...(允许构造,但不是WITH DATATYPE float或double)。

但是,我如何简单地使用不同的int和double值来初始化模板?

typedef struct 
{
    cParameter<int, 42> someVariable;
    cParameter<float, 23.0f> someOtherVariable;
} myStructure_t;

这里做什么?任何提示?

1 个答案:

答案 0 :(得分:0)

如果您可以为每种类型设置固定的默认值,则可以创建一个类型以将其定义为常量,并根据需要对其进行特殊处理。

template <typename T> struct MyTypeDefault { static const T value; };
template <typename T> const T MyTypeDefault<T>::value = T();
template <> struct MyTypeDefault<double> { static const double value; };
const double MyTypeDefault<double>::value = 1.0;

template <typename T>
class MyType {
    public:
    MyType() { value = MyTypeDefault<T>::value; }
    private:
        T value;
 };