【问题标题】:C++ define functions based on template typesC++根据模板类型定义函数
【发布时间】: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&lt;A, B&gt;(对于任何类型 AB s.t. A != B),它工作正常。但是,当我尝试使用MyPairType&lt;T, T&gt;(对于任何类型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_ifstd::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。即使T1T2 都是int,转换是否会有所不同?我怎样才能做到这一点?

【问题讨论】:

  • 您可以针对不同类型专门化该类。

标签: c++ c++11 templates stl


【解决方案1】:

为它们相同的情况创建一个专业化。注意:为避免这种情况,您可能想要做标准库所做的事情并提供用于访问第一个和第二个元素的方法,而不是提供一个转换方法。这样即使类型相同,方法也不同,所以不会重载。

无论如何,您都可以通过在原始定义之后添加它来进行专业化,

template<typename F>
struct MyPairType<F, F> {
  F first;                                                                           
  F second;                                                                        
  MyPairType() { }
  MyPairType(F f, F s) { first = f; second = s; }
  operator F() const { return first; }
};

此外,您的构造函数命名不正确。 VPairType -> MyPairType。

编辑:刚刚意识到这样您将永远无法通过强制转换访问第二个元素。你应该只提供一个F first()F second() 方法

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 2017-03-14
    • 2012-05-10
    • 2013-04-11
    • 2011-02-17
    • 1970-01-01
    相关资源
    最近更新 更多