考虑以下模板类的实现:
template<class T>
class MyClass
{
public:
void setVar1(const T& v1)
{
var1 = v1;
}
void setVar2(const T1& v2)
{
var2 = v2;
}
T var1;
T1 var2;
};
如果模板参数T
是基本类型(例如float
,double
或long double
),我希望T1 = T
。
如果模板参数T
为std::complex<float>
,我希望T=std::complex<float>
和T1 = float
。同样适用于std::complex<double>
和std::complex<long double>
。
但是,其他成员函数会阻止在此上下文中使用其解决方案。
答案 0 :(得分:0)
自定义特征类就足够了。您可以利用部分特化来选择您想要/需要的类型。示例代码
template<typename T, bool F> class Base;
template<typename T>
class Base <T, true> {
public:
T var2;
};
template<typename T>
class Base <std::complex<T>, false> {
public:
typename std::complex<T>::value_type var2;
};
template <typename T>
class BaseHelper : public Base<T, std::is_fundamental<T>::value> {};
template<class T>
class MyClass : public BaseHelper<T> {
public:
using T1 = decltype(BaseHelper<T>::var2);
void setVar1(const T& v1) {
var1 = v1;
}
void setVar2(const T1& v2) {
this->var2 = v2;
}
T var1;
};
还有很多其他方法。
答案 1 :(得分:0)
基于Bo Personns的评论以及https://stackoverflow.com/questions/47334675/template-type-derivation
提供的答案我得到了以下工作示例。
我的.h文件内容如下。
#include <iostream>
#include <complex>
#include <typeinfo>
template <typename T>
class MyClass
{
template <typename T0>
struct myTypeTraits
{ using type = T0; };
template <typename T0>
struct myTypeTraits<std::complex<T0>>
{ using type = T0; };
public:
using T0 = typename myTypeTraits<T>::type;
void setVar1(const T0& v);
void setVar2(const T& v);
T getVar2() const;
void print() const;
T0 var1;
T var2;
};
.cpp文件包含以下代码行。
template <class T>
void MyClass<T>::setVar1(const T0& v)
{
var1 = v;
}
template <class T>
void MyClass<T>::setVar2(const T& v)
{
var2 = v;
}
template <class T>
T MyClass<T>::getVar2() const
{
return var2;
}
template <typename T>
void MyClass<T>::print() const
{
std::cout<<"var1: "<<var1<<std::endl;
std::cout<<"var2: "<<var2<<std::endl;
}
int main()
{
MyClass<float> tmp;
MyClass<std::complex<float> > tmp1;
tmp.print();
tmp1.print();
return 0;
}
上述代码按预期工作。
发布了另一个相关问题