对不同的特性专门化同一个操作符
Specialize same operator for different traits
我想按特征进行专门化。
-
Array Aa = Scalar in_a
将使用overload I
-
Array Aa = Array Bb
将使用overload II
在下面的代码中,没有使用overload II
。
有人提到T1
不能从overload II
中推导出来。
如何解决这个问题?
我使用c++ shell用c++ 14编译代码。
#include <iostream>
#include <type_traits>
using namespace std;
class A; // forward declaration.
template <typename T>
struct is_A : false_type {};
template <> struct is_A<A> : true_type {};
template <typename T>
struct is_int : false_type {};
template <> struct is_int<int> : true_type {};
template <> struct is_int<long> : true_type {};
class A{
public:
int val;
void print(void){
std::cout << val << std::endl;
}
template <typename T1>
enable_if_t<is_int<T1>::value,void>
operator=(const T1 & input){
val = 2*input; //Overload I
}
template <typename T1>
enable_if_t<is_A<T1>::value,void>
operator=(const T1 & Bb){
val = 5*Bb.val; //Overload II
}
};
int main(void){
A Aa;
A Bb;
int in_a = 3;
Aa = in_a; //This uses overload I as intended.
Bb = Aa; //I want this to use overload II, but
//actually overload I is used.
//This leads to an error during compilation.
Aa.print(); //This should give 6. (3x2)
Bb.print(); //This should give 30. (6x5)
}
这是您的代码简化和工作的预期:
#include <iostream>
#include <type_traits>
#include<utility>
class A;
template <typename T>
struct is_A : std::false_type {};
template <> struct is_A<A> : std::true_type {};
template <typename T>
struct is_int : std::false_type {};
template <> struct is_int<int> : std::true_type {};
template <> struct is_int<long> : std::true_type {};
class A{
public:
int val;
void print(void){
std::cout << val << std::endl;
}
template <typename T1>
std::enable_if_t<is_int<std::decay_t<T1>>::value, void>
operator=(T1 && input){
val = 2*std::forward<T1>(input);
}
template <typename T1>
std::enable_if_t<is_A<std::decay_t<T1>>::value,void>
operator=(T1 && Bb){
val = 5*std::forward<T1>(Bb).val;
}
};
int main(void){
A Aa;
A Bb;
int in_a = 3;
Aa = in_a;
Bb = Aa;
Aa.print(); //This should give 6. (3x2)
Bb.print(); //This should give 30. (6x5)
}
你的代码应该是
template <typename T>
std::enable_if_t<is_int<T>::value, A&>
operator=(const T& input){
val = 2 * input; //Overload I
return *this;
}
template <typename T>
std::enable_if_t<is_A<T>::value, A&>
operator=(T& rhs){
val = 5 * rhs.val; //Overload II
return *this;
}
演示但你的情况更简单
A& operator=(int input){
val = 2 * input; //Overload I
return *this;
}
A& operator=(const A& rhs){
val = 5 * rhs.val; //Overload II
return *this;
}
您真的需要为您的简单案例使用所有的模板魔法吗?
#include <iostream>
class A;
class A{
public:
int val;
void print(void){
std::cout << val << std::endl;
}
void operator =(const A& in){ val = in.val*5; }
void operator =(int in) { val = in*2; }
};
int main(void){
A Aa;
A Bb;
Aa = 3;
Bb = Aa;
Aa.print(); //This should give 6. (3x2)
Bb.print(); //This should give 30. (6x5)
return 0;
}
相关文章:
- 是否可以对零模板参数进行模板专门化
- 为什么std::async使用同一个线程运行函数
- 尝试根据类中 typedef 的存在来专门化模板函数
- 多个"常量引用"变量可以共享同一个内存吗?
- 如何基于模板化类的基类专门化成员函数
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 为什么同一个变量的内存地址不同?
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 两个进程可以通过跟踪附加到同一个 PID 吗?
- 如何在同一个 CMAKE 项目中强制链接到共享库?
- 是否可以在文本文件中找到最长单词的长度,并在同一个文本文件中读取,只需 1 个 while 循环?
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 不同C++文件中未命名命名空间中的名称可以引用同一个命名事物吗?
- 如何使用模板化类专门化模板化函数?
- 我应该如何使用 epoll 从同一个 FD 读取和写入
- 如何在同一个模板功能上专门化几种类型?
- 对不同的特性专门化同一个操作符
- 同一个模板的多个专门化在单个类中具有不同的类型名