gpt4 book ai didi

c++ - 如何删除可变参数模板构造函数的复制/移动实例化

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:20 24 4
gpt4 key购买 nike

假设这是我的类(class):

#include<utility>
#include<type_traits>

template<typename T>
class MyClass {
T v;
public:
template<typename...Ts>
MyClass(Ts&&...args) :v{ std::forward<Ts>(args)... } {}

MyClass(MyClass const&) = default;
MyClass(MyClass &&) = default;
};

class OtherClass {
public:
operator MyClass<int>() {
return{};
}
};

int main(){
MyClass<int> mc;
MyClass<int> mc2{ mc }; // error: cannot convert from 'MyClass<int>' to 'int'
OtherClass oc;
MyClass<int> mc3 {oc}; // error: cannot convert from 'OtherClass' to 'int'
}

如何正确防止可变参数模板构造函数实例化复制/移动构造函数?

最佳答案

可以申请SFINAEstd::enable_if限制类型,例如

template <typename... Ts>
struct getFirstType {
using type = void;
};
template <typename T, typename... Ts>
struct getFirstType<T, Ts...> {
using type = T;
};

template<typename T>
class MyClass {
T v;
public:
// only valid when the first type of parameter pack is NOT MyClass
template<typename...Ts,
typename = std::enable_if_t<
!std::is_same_v<MyClass,
std::decay_t<typename getFirstType<Ts...>::type>>>>
MyClass(Ts&&...args) :v{ std::forward<Ts>(args)... } {}

MyClass(MyClass const&) = default;
MyClass(MyClass &&) = default;
};

LIVE

关于c++ - 如何删除可变参数模板构造函数的复制/移动实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47686460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com