从模板函数返回向量

时间:2016-04-13 16:02:17

标签: c++ templates

希望在此澄清一下。下面的代码执行正常,但是当我取消注释else语句时,会发生编译错误。这是因为在main我指定了int类型的事件,尽管有string类型的可能性。我已经将我的实际代码简化为下面的内容以缩小问题的范围,我该怎么做才能使data中的向量main可以是任何类型的getNextLineOfData返回?

#include <vector>
using namespace std;

template< typename T>
std::vector<T> getNextLineOfData(bool someBoolean)
    {
        std::vector<T> data;
        if (someBoolean)
        {
            data.push_back(1);
            data.push_back(2);
            data.push_back(3);
        }
        /*
        else
        {
            data.push_back("1");
            data.push_back("2");
            data.push_back("3");
        }
        */
return data;
    };

int main()
{
vector<int> data = getNextLineOfData<int>(true);
return 0;
}

3 个答案:

答案 0 :(得分:-1)

您在代码片段中将编译时操作与运行时操作混淆。模拟函数getNextLineOfData并使用getNextLineOfData<int>实例化时,编译器会继续生成一个为您返回向量的函数。但是,if语句仅在运行时进行评估。因此,当编译器尝试构建代码时,它会发现您要根据条件将1"1"添加到vector<int>容器中。这是不允许的。 您可以使用模板专业化来解决您的问题。

#include <vector>

using namespace std;

template<typename T>
std::vector<T> getNextLineOfData() {
  // default
}

template<>
std::vector<int> getNextLineOfData()
    {
        std::vector<int> data;

            data.push_back(1);
            data.push_back(2);
            data.push_back(3);

            return data;
    };

template<>
std::vector<std::string> getNextLineOfData()
    {
        std::vector<std::string> data;

            data.push_back("1");
            data.push_back("2");
            data.push_back("3");

            return data;
    };
int main()
{
    vector<int> data = getNextLineOfData<int>();
    return 0;
}

编辑:正如@BobTFish指出的那样,重载函数而不是模板专门化它可能会更好。上面的解决方案解决了您最初设置时的问题。

答案 1 :(得分:-1)

从评论中的额外信息中读取,我建议如下:

void getNextLine(std::vector<std::string>& output)
{
    output.push_back("string data as you please");
}

void getNextLine(std::vector<int>& output)
{
    output.push_back(1);
}

bool nextLineIsIntData()
{
    // somehow determine if the coming data is strings or ints
    return false;
}

int main()
{
    std::vector<std::string> stringData;
    std::vector<int> intData;
    if (nextLineIsIntData())
        getNextLine(intData);
    else 
        getNextLine(stringData);
    // do whatever you want
}

答案 2 :(得分:-1)

你正在做的事情完全是非法的。当查看你说的if-else语句时,如果某些条件为真,那么将执行此,但将不会因此,编译器将忽略未执行的部分的原因太多了。这是错误的。您需要做的事情,在之前的答案中列出的是过载或专门针对不同数据类型的功能。

我还应该提一下,你尝试做的事情是糟糕的风格。您实际上依赖于用户也传递了正确的bool值,这会影响您push_back()到向量中的类型。为什么当您拥有模板模式匹配的强大功能时,可以完全消除依赖正确用户输入的需要。

在这种情况下,您遇到的任何类似情况都要让编译器决定