基于模板类型的类的类型

时间:2019-02-22 11:32:22

标签: c++

请考虑以下情况:

#include<iostream>

template<class U>
class Table_Inside {
  U a;
};

template<class T>
class Table {
  Table_Inside<T> *tmp;
};

int main() {
  Table<int> obj;
}

这样做将为int类/对象创建类型为Table_Inside的数据成员。我很难理解如果删除Table_Inside类的模板并创建两个独立的类,例如Table_Inside_intTable_inside_char会发生什么。假设U只有两个选项。在这种情况下,我们应该如何处理,以使Table类具有指向相应类的指针。例如

#include<iostream>
class Table_Inside_int {
  int a;
};

class Table_Inside_char {
  char c;
}

template<class T>
class Table {
  /*<what to write here to create corresponding class pointer>*/ *tmp;
}

int main() {
  Table<int> obj;
}

所以,如果我通过了,

Table<int> obj

它应该在Table类内创建类型为Table_Inside_int的指针(tmp)。

如果我通过了,

Table<char> obj

它应该在Table_Inside_char类内创建类型为Table的指针(tmp)。

在c ++世界中甚至有可能吗?

3 个答案:

答案 0 :(得分:2)

如果专业化效果不佳并且只有几种类型,则可以使用std::conditionalstd::is_same来创建别名:

// assumes only char or int will be passed
template <class T>
using Table_Inside = std::conditional_t<std::is_same_v<T, char>, Table_Inside_char, Table_Inside_int>;

可以像以前Table_Inside<T>一样使用它。

答案 1 :(得分:1)

这可以通过专业化轻松完成:

// The "base" generic case
template<typename T>
class Table_Inside;

template<>
class Table_Inside<char>
{
    // Special implementation for characters
};

template<>
class Table_Inside<int>
{
    // Special implementation for integers
};

template<typename T>
class Table
{
    Table_Inside<T>* tmp;
};

如果您需要charint类之间共享的通用功能,则可以使用继承。

答案 2 :(得分:1)

您可以使用某些特征来处理此问题。定义

file$Start <- as.Date(file$Start)
file$End <- as.Date(file$End)

if (interactive()) 
library(shiny)
shinyApp(
ui = fluidPage(
  timevisOutput("timeline"),
  actionButton("btn", "Fit all items")
),
server = function(input, output) {
  output$timeline <- renderTimevis(
    timevis(data.frame(
     id = file$Record_ID, start =  file$Start , end = file$End, content = 
 file$Date_Bucket
    ))
  )
  observeEvent(input$btn, {
    fitWindow("timeline", list(animation = TRUE))
  })
 }
 )
 }

并通过

使用它
// Primary template
template <class T>
struct Table_Trait;

// Specialization
template <>
struct Table_Trait<int> { using type = Table_Inside_int; };

template <>
struct Table_Trait<char> { using type = Table_Inside_char; };

template <class T>
using Table_Inside_t = typename Table_Trait<T>::type;

但是,如果不需要独立的类template<class T> class Table { Table_Inside_t *tmp; }; Table_Inside_int,则可能有一个更简单的解决方案。您也可以直接使用专业化

Table_Inside_double