【发布时间】:2019-04-23 13:26:57
【问题描述】:
假设我有以下结构MyPairType。
template<typename F, typename S>
struct MyPairType {
F first;
S second;
MyPairType() { }
MyPairType(F f, S s) { first = f; second = s; }
operator F() const { return first; }
operator S() const { return second; }
};
当我尝试使用 MyPairType<A, B>(对于任何类型 A 和 B s.t. A != B),它工作正常。但是,当我尝试使用MyPairType<T, T>(对于任何类型T)时,它会失败,因为两个转换运算符相同:
error: ‘MyPairType<F, S>::operator S() const [with F = int; S = int]’ cannot be overloaded
operator S() const { return second; }
^
error: with ‘MyPairType<F, S>::operator F() const [with F = int; S = int]’
operator F() const { return first; }
我发现这可以使用std::enable_if 和std::is_same 的组合来解决,但它需要模板化操作符函数,这是不可取的。
假设我有以下代码:
typedef int T1;
typedef int T2;
...
MyPairType<T1, T2> my_pair(3, 5);
T1 frst = my_pair;
T2 scnd = my_pair;
std::cout << frst << " " << scnd << std::endl;
对于上面的代码,我希望输出为3 5。即使T1 和T2 都是int,转换是否会有所不同?我怎样才能做到这一点?
【问题讨论】:
-
您可以针对不同类型专门化该类。