2

我正在尝试提出一个允许通过可变参数模板参数创建多种类型的类,但在编译过程中出现错误:

http://ideone.com/nDWBET

#include <list>
#include <memory>

struct IBaseType
{
};

class Type1 : public IBaseType
{
};

class Type2 : public IBaseType
{
};

template <typename... T>
class CreateTypes
{
public:
    CreateTypes()
    {
        [](...){ }((m_types.push_back(std::unique_ptr<T>(new T())))...);
    }

private:
    std::list<std::unique_ptr<IBaseType>> m_types;
};

int main()
{
    CreateTypes<Type1, Type2> createTypes;
    return 0;
}

prog.cpp:在 'CreateTypes::CreateTypes() [with T = {Type1, Type2}]'的实例化中:
prog.cpp:31:28: 需要从这里
prog.cpp:22:9: 错误:无效使用空虚的表达

解决方案是什么?或者我可以采取其他方法吗?

4

2 回答 2

1

这里的问题是,push_back返回无效。你可以尝试使用insert

[](...) { }((m_types.insert(m_types.end(), std::unique_ptr<T>(new T())), 0)...);

来自评论:使用 0push_back也可以。

[](...) { }((m_types.push_back(std::unique_ptr<T>(new T())), 0)...);
于 2013-06-07T10:29:39.090 回答
0

ForEveR 和 Xeo 给了我正在寻找的答案,但我不得不稍微调整他们的解决方案,因为 Clang 不会执行空 lambda 的代码(我假设它已被优化掉,即使在调试中也是如此)。这是我的最终解决方案(其中包含运行时检查以确保始终创建正确数量的类型):

template <typename... Types>
struct VariadicTemplateCount
{
    static const size_t value = sizeof...(Types);
};

// ..............

CreateTypes()
{
    struct ShutTheCompiler
    {
        static void Up(const int[])
        {
        }
    };

    const int creation[] = {0, (m_types.push_back(std::unique_ptr<T>(new T())), 0)... };
    ShutTheCompiler::Up(creation);
    ASSERT(m_types.size() == VariadicTemplateCount<Types...>::value);
}
于 2013-06-11T13:28:49.540 回答