使用C ++类型特征,是否有一些方法可以避免转换

时间:2018-03-22 15:10:00

标签: c++ templates template-specialization typetraits

假设我在方法模板中使用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可以是非数字类型,我可以通过强制解决它,但是想避免它)

1 个答案:

答案 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属于另一种类型时,该使用也必须起作用。