请考虑以下情况:
#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_int
和Table_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 ++世界中甚至有可能吗?
答案 0 :(得分:2)
如果专业化效果不佳并且只有几种类型,则可以使用std::conditional
和std::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;
};
如果您需要char
和int
类之间共享的通用功能,则可以使用继承。
答案 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