gpt4 book ai didi

c++ - 非冗长的解决方案,使基于模板类型的类成员变量为可选?

转载 作者:行者123 更新时间:2023-12-02 10:10:26 25 4
gpt4 key购买 nike

我希望仅在使用模板类型int实例化类时才定义类成员变量only_if_int。我有一个可行的解决方案,但这太冗长了。

#include <iostream>
#include <type_traits>

template<typename T, typename Enable = void>
class MyClass;

template<typename T>
class MyClass<T, std::enable_if_t<std::is_same<T, int>::value>>{
public:
int common;
int only_if_int;

MyClass()
{
common = 0;
only_if_int = 0;
}

void alter_values()
{
common++;
only_if_int++;
}
};

template<typename T>
class MyClass<T, std::enable_if_t<!std::is_same<T, int>::value>>{
public:
int common;
MyClass()
{
common = 0;
}

void alter_values()
{
common++;
}
};

int main()
{
MyClass<int> int_class;
MyClass<float> float_class;
int_class.alter_values();
float_class.alter_values();

std::cout<<"\n int_class "<<int_class.common<<" "<<int_class.only_if_int;
std::cout<<"\n int_class "<<float_class.common<<" ";

return 0;
}
在上面的代码中,模板化类 MyClass被定义了两次(重复的代码太多)。例如:alter_values函数被写入两次。有没有更冗长的方法,也许借助 constexpr std::is_same<T, int>或其他C++功能来完成相同的事情?

最佳答案

一种方法是只有在使用int实例化时,才包含一个int成员的类型,如下所示:

template<typename>
struct OnlyInt {};

template<>
struct OnlyInt<int> {
int only_if_int;
};
然后 MyClass可以继承这种类型:
template<typename T>
class MyClass : public OnlyInt<T> {
public:
int common;
// ... contains only_if_int if T == int
};
现在,对 only_if_int的所有使用都需要包装在 if constexpr中,并且您必须使用 this->指示该成员来自基类。因此,例如:
only_if_int = 0;
变成:
if constexpr (std::is_same_v<T, int>)
this->only_if_int = 0;
等等
这是 demo

关于c++ - 非冗长的解决方案,使基于模板类型的类成员变量为可选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63820176/

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