新构造的对象作为默认模板函数参数

时间:2012-12-18 17:14:28

标签: c++ templates

Test::load应该将数据(通过名称或索引描述)加载到传递的引用中。作为第三个参数,在加载失败的情况下存在默认值(数据从文件加载)。

struct Test
{
    template <typename ValueType, typename DefaultValueType>
    void load(const char * c, ValueType & a, DefaultValueType b)
    {
        std::cout << "1";
    }

    template <typename ValueType, typename DefaultValueType>
    void load(int i, ValueType & a, DefaultValueType b)
    {
        std::cout << "2";
    }
};

我需要ValueTypeDefaultValueType,因为我特别需要字符串和自定义类型。 当我想使用默认构造类型作为从ValueType推导出的默认第三个参数(在const char *版本中)时,会出现问题。

template <typename ValueType, typename DefaultValueType>
void load(const char * c, ValueType & a, DefaultValueType b = ValueType())
{
    std::cout << "1";
}

我收到expects 3 arguments错误(vs2010)。

为什么它不起作用?我需要做workaroud来完成这项工作。


如果有兴趣玩游戏,这里是完整的“工作”代码

#include <iostream>

struct Test
{
    template <typename ValueType, typename DefaultValueType>
    void load(const char * c, ValueType & a, DefaultValueType b/* = ValueType()*/)
    {
        std::cout << "1";
    }

    template <typename ValueType, typename DefaultValueType>
    void load(int i, ValueType & a, DefaultValueType b)
    {
        std::cout << "2";
    }

    //Workaround
    template<typename ValueType>
    void load(const char * c, ValueType & v)
    {
        load(c,v,ValueType());
    }
};

int main()
{
   Test t;
   float f;

   //This is standard behavior
   t.load("bar", f, 0.0f);

   //I want this to be possible call
   t.load("bar", f);
}

1 个答案:

答案 0 :(得分:2)

您正在寻找部分template specialization。但是,部分模板专门化仅适用于类而不适用于函数。对于函数,您可以通过重载来解决问题,这正是您在解决方法中所做的。

这是关于模板函数重载而不是特化的原因的writeup

相关问题