【发布时间】:2021-01-01 09:13:27
【问题描述】:
我有这段代码,它用每列的字符串数据填充我的行结构。
struct row_t
{
row_t()
{};
template<typename ...T>
row_t(const T& ...var)
{
append(var...);
}
template<typename T, typename ...Types>
void append(const T &var1, const Types& ...var2)
{
// here should be some kind of check, that number of arguments == COLUMN_COUNT
data.append_copy(var1);
append(var2...);
}
template<typename T>
void append(const T &var1)
{
data.append_copy(var1);
}
array_local_t<sstring_t, COLUMN_COUNT> data; // my implementation of arrays
};
我可以这样调用:
row_t tmp_row(a,b,c,d);
//with a, b, c, d being my sstring_t types
现在,您可能已经注意到,我的数据数组是 sstring_t 类型的。因此,如果我尝试使用 a、b、c、d 为 int 来调用它,我将无法编译代码 -> 我不需要或不希望模板函数的类型名称为 T,而只有 sstring_t,因为在我的情况下,这是唯一有意义的事情(所以我不想将数据数组更改为类型 T 并称之为一天)。我只能写这样的代码。您能帮我使用 C++11 max 将其转换为仅特定类型(sstring_t)吗?
【问题讨论】:
-
static_assert(std::is_same<typename std::common_type<T...>::type, sstring_t>::value);在构造函数中?? -
如您所说,如果您尝试传入
ints,则会出现编译时错误。那么为什么你需要重写它呢?如果这是问题,使用static_assert可以给你一个更清晰的错误信息。 -
由于实施,您的代码已经只适用于
sstring_t,您真的想要/需要对 SFINAE 友好吗? -
std::initializer_list也是可变参数的替代品。
标签: c++ c++11 templates variadic-templates variadic-functions