如何仅在存在副本构造函数时调用它? C ++

时间:2018-11-20 22:48:21

标签: c++ templates constructor variadic-functions copy-constructor

我正在制作一个Entity-Component-System Engine,并且在使用预制件时遇到了一些麻烦。我只想复制预制件,除非用户传递的类具有模板可复制构造。我想做的一个简单的实现就是这样:

void addFromPrefab() { //We assume that _prefab is of type std::shared_ptr<T>
    if (std::is_copy_constructible<T>::value)
        addComponent(*_prefab); // Add a new component by copy constructing the prefab passed as parameter
    else if (std::is_default_constructible<T>::value)
        addComponent(); // Add a new component with his default constructor
    else
        throw std::exception();
}

template<typename ...Args>
void addComponent(Args &&...args) {
    store.emplace_back(std::make_shared<T>(args ...));
}

是否有办法使此代码正常工作?实际上,它使我无法创建特定的类,因为它是一个可复制构造的构造函数被删除(这种情况)。

在此先感谢您,我的错误是我的法语;)

1 个答案:

答案 0 :(得分:3)

如果您使用C ++ 17,请使用if constexpr

void addFromPrefab() { //We assume that _prefab is of type std::shared_ptr<T>
    if constexpr(std::is_copy_constructible<T>::value)
        addComponent(*_prefab); // Add a new component by copy constructing the prefab passed as parameter
    else if constexpr(std::is_default_constructible<T>::value)
        addComponent(); // Add a new component with his default constructor
    else
        throw std::exception();
}

如果不这样做,则必须使用SFINAE:

std::enable_if<std::is_copy_constructible<T>::value> addFromPrefab() { //We assume that _prefab is of type std::shared_ptr<T>
    addComponent(*_prefab); // Add a new component by copy constructing the prefab passed as parameter
}
std::enable_if<!std::is_copy_constructible<T>::value && std::is_default_constructible<T>::value> addFromPrefab() {
    addComponent(); // Add a new component with his default constructor
}

std::enable_if<!std::is_copy_constructible<T>::value && !std::is_default_constructible<T>::value> addFromPrefab() {
        throw std::exception();
}