基于模板元组的Arity的C ++ Enable方法

加布里埃尔

我试图仅在元组模板参数具有某种特定性的情况下在模板化类中选择性地启用方法。我一直在尝试各种组合,但到目前为止,找不到找到以下代码进行编译的方法。

本质上,当我使用仅包含两个元素的元组实例化foo类时,我希望启用第一个“ void print()”方法,而当我使用其中包含三个元素的元组实例化foo时,就像第二个启用“ void print()”方法一样。

注意:这只是从我要解决的更复杂问题中提炼出来的抽象示例。我还可以使用基于两个特定元组的部分模板专业化来工作。但是我真的很想了解“ enable_if”,我希望它将使我的代码“更简单”。

谢谢

// g++ -std=c++14 a.cc

#include <tuple>
#include <type_traits>
#include <iostream>

using namespace std;

template <class Tuple>
class foo {
public:
  Tuple t;  
 
  foo(Tuple ta) : t(ta) {
    cout<<"constructor\n";
  }  

  //How do I enable this print ONLY if arity of input tuple is 2  ???
  
  typename std::enable_if< std::tuple_size<Tuple>::value == 2, void >::type
  print(){
    cout<<get<0>(t)<<":"<<get<1>(t)<<"\n";
  }  

  // enable ONLY if arity 3 ???
  typename std::enable_if< std::tuple_size<Tuple>::value == 3, void >::type
  print(){
    cout<<get<0>(t)<<":"<<get<1>(t)<<"::"<<get<1>(t)<<"\n";
  }
};

int main(int argc, char**argv) {  
  typedef tuple<int, double>        t2_type;
  typedef tuple<int, double, float> t3_type;  

  t2_type t2(1,2.0);
  t3_type t3(100,100.0,2.3);  

  foo<t2_type> f2(t2);
  foo<t3_type> f3(t3);  

  f2.print();
  f3.print();
}

对于上面的特定代码,这里是编译器错误:

% g++ -std=c++14 a.cc 
a.cc:25:3: error: ‘typename std::enable_if<(std::tuple_size<_Tp>::value == 3), void>::type foo<Tuple>::print()’ cannot be overloaded
   print(){
   ^
a.cc:19:3: error: with ‘typename std::enable_if<(std::tuple_size<_Tp>::value == 2), void>::type foo<Tuple>::print()’
   print(){
   ^
a.cc: In instantiation of ‘class foo<std::tuple<int, double, float> >’:
a.cc:38:21:   required from here
a.cc:19:3: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
a.cc: In function ‘int main(int, char**)’:
a.cc:41:6: error: ‘class foo<std::tuple<int, double, float> >’ has no member named ‘print’
   f3.print();
      ^

GCC详细信息,尽管这应独立于编译器;

% g++ -v
gcc version 4.9.4 (GCC) 

解决方案1来自以下答案:

#include <tuple>                                                                                                                                                                                                                                                                                                        
#include <type_traits>                                                                                                                                                                                                                                                                                                  
#include <iostream>                                                                                                                                                                                                                                                                                                     

using namespace std;                                                                                                                                                                                                                                                                                                    

template <class Tuple>                                                                                                                                                                                                                                                                                                  
class foo {                                                                                                                                                                                                                                                                                                             
public:
  Tuple t;

  foo(Tuple ta) : t(ta) {                                                                                                                                                                                                                                                                                               
    cout<<"constructor\n";                                                                                                                                                                                                                                                                                              
  }

  template <typename T = Tuple>
  typename std::enable_if< std::tuple_size<T>::value == 2, void >::type
  print(){
    cout<<get<0>(t)<<":"<<get<1>(t)<<"\n";
  }

  // enable ONLY if arity 3 ???                                                                                                                                                                                                                                                                                         
  template <typename T = Tuple>
  typename std::enable_if< std::tuple_size<T>::value == 3, void >::type
  print(){
    cout<<get<0>(t)<<":"<<get<1>(t)<<"::"<<get<1>(t)<<"\n";
  }

};

int main(int argc, char**argv) {
  typedef tuple<int, double>        t2_type;
  typedef tuple<int, double, float> t3_type;

  t2_type t2(1,2.0);
  t3_type t3(100,100.0,2.3);

  foo<t2_type> f2(t2);
  foo<t3_type> f3(t3);

  f2.print();
  f3.print();
}
慈济

您需要制作print一个模板才能使用enable_if您可以为此使用class template参数:

template <typename T = Tuple>
    typename std::enable_if< std::tuple_size<T>::value == 2, void >::type
print() {
    cout<<get<0>(t)<<":"<<get<1>(t)<<"\n";
}  

template <typename T = Tuple>
    typename std::enable_if< std::tuple_size<T>::value == 3, void >::type
print() {
    cout<<get<0>(t)<<":"<<get<1>(t)<<"::"<<get<1>(t)<<"\n";
}

这是一个演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Erlang中基于Arity的指定方法

C ++函数重载,enable_if的替代方法?

使用enable_if专门化模板方法

使用不取决于方法的模板参数的enable_if

基于可变模板存在的std :: enable_if

C ++ enable_if模板类方法(如果它是std :: vector <std :: vector <Type >>)

C++模板类,基于typename改变类方法的行为

基于Lambda Arity的专业化功能模板

c++ type_traits:为什么我不能从另一个模板/ enable_if 行调用模板化静态方法?

C ++:基于整数模板参数创建可变长度元组

基于布尔模板参数的启用方法

如何通过专门化在声明和定义分别的模板化类方法上使用std :: enable_if

元组上的递归可变参数模板方法

基于C ++模板的get()

C ++有没有一种方法可以基于type_traits进行模板重载?

带有std :: enable_if的c ++模板特化

c ++ 11 enable_if错误-模板参数重新声明

c ++ enable_if用于非类型模板参数

Enable_if作为模板参数

如何基于数组元素自动创建模板类的元组?

在类模板方法中使用enable_if检查两个函数参数参数是否均为std :: array或均为std :: vector

基于整体类模板专门化类方法

禁用函数的基于参数的模板参数推导的更好方法?

(可选)基于可变参数模板参数发布方法

Angular:基于活动routerlink绑定模板var的干净方法

具有std :: enable_if的C ++可变参数模板部分模板专业化

元组作为 C++ 中的模板

c ++方法作为模板参数

C ++虚拟模板化方法