我有一个可变参数模板函数,它接受具有同类成员类型的POD(普通旧数据结构)。
可接受的POD可以完全由4字节整数XOR 4字节浮点数组成。
在内部,variadic参数被强制转换为基础类型的指针,并用作基本数组。
目前,模板功能要求用户提供有关这些POD格式的一些附加信息;如下所示:
Blah much, wow; // Underlying type is integral.
Bleh such, params; // underlying type is float.
//...
foo("iffi",much,params,such,wow);
test = structure(list(sex1 = c("totalmaleglobal", "totalfemaleglobal",
"totalglobal", "totalfemaleGSK", "totalfemaleglobal",
"totalfemaleUN")), .Names = "sex1", row.names = c(NA, 6L),
class="data.frame")
total = grep("total", test[[1]], perl=TRUE, value=TRUE)
totalmale = grep("totalmale", test[[1]], perl=TRUE, value=TRUE)
totalfemale = grep("totalfemale", test[[1]], perl=TRUE, value=TRUE)
print(total)
print(totalmale)
print(totalfemale)
它有效,但我想绕过格式化字符串。
有没有办法在编译时评估基础类型?
编辑:结构的布局及其成员的名称在编译时才知道。也就是说,库的用户提供了一个任意的同类POD。
答案 0 :(得分:0)
要绕过字符串格式化,您可以创建一个特征:
template <typename T /*, typename AlwaysVoidForSFINAE = void*/> struct UnderlyingPodType;
template <> struct UnderlyingPodType<Blah> { using type = int; };
template <> struct UnderlyingPodType<Bleh> { using type = float; };
template<typename ...Ts>
void foo(Ts&&... ts)
{
using types = std::tuple<UnderlyingPodType<std::decay_t<Ts>>...>;
// ...
}