假设我在方法模板中使用C ++类型特征来检查T是否为double,是否有某种方法可以将T类型的变量视为double,而不进行强制转换?
投票结束 喜爱 假设我在方法模板中使用C ++类型特征来检查T是否为双,是否有某种方法可以将T类型的变量视为double,而不进行强制转换?var json = JsonConvert.DeserializeObject<JObject>(JsonData);
List<string> value1s = json.SelectTokens("Results.*.*.value1").Values()
.Select(t => t.ToString())
.ToList();
(这会哭,因为T可以是非数字类型,我可以通过强制解决它,但是想避免它)
答案 0 :(得分:0)
如果我正确理解了您的问题,那么您希望拥有的是T
double
{}的专业化。好吧,就这样做 - 没有涉及类型特征:
template <typename T>
void foo(T x) { /* do something with x */ }
template <>
void foo<double>(double x) { /* do something _else_ with x */ }
或者,如果你使用C ++ 17,你也可以这样做:
template <typename T>
void foo(T x) {
if constexpr (not std::is_same_v<double,T>) {
/* do something with x */
}
else {
/* do something with else x */
}
}
请注意constexpr
之后的if
。这意味着每个块中的代码仅针对适当的实例进行编译;没有它,您不能在x
块中使用else
作为双精度,因为当x
属于另一种类型时,该使用也必须起作用。