我想知道如何找到使用显式实例化模板函数的代码点。
template <typename T> RNNullableTyped<T> Get(const json::json &json);
template <> RNNullableTyped<int > Get(const json::json &json);
template <> RNNullableTyped<double > Get(const json::json &json);
template <> RNNullableTyped<std::string > Get(const json::json &json);
template <> RNNullableTyped<std::wstring> Get(const json::json &json);
std::string AsString(const json::json &elem)
{
return Get< std::string >(elem).Get();
}
现在我喜欢查找像上面这样的代码点,但我无法轻松搜索它。如果我将其注释掉,我只会收到未解决的外部链接器错误。将其注释为已弃用似乎模板函数不支持。
因此,为了解决这个问题,我的一位同事将用显式的一次替换这些寺庙函数,例如
GetInt
,GetDouble
,GetStdString
,GetStdWstring
...等等,我不这样做非常喜欢....
我希望有人可以向我展示一种方法,如何找到代码中使用显式实例化模板函数的点。
我应该补充一点,我们使用 Microsoft Visual C++ 编译器。
问候, 罗纳德。
首先,这些是显式专业化声明,而不是显式实例化定义。显式专业化声明以
template<>
开头,而显式实例化声明以 template
开头,后面不跟 <
。
对于显式专业化声明,源文件中的某处必须有相应的显式专业化定义。
您可以通过 IDE 的工具找到专业化的所有用途(理想情况下,它应该能够向您显示对函数模板的特定专业化的所有引用。)
或者,您可以使用
[[deprecated]]
标记显式专业化,这应该会导致编译器在引用它们时发出警告:
template <> [[deprecated]] RNNullableTyped<int > Get(const json::json &json);
或者,您可以在头文件中将显式专业化声明标记为
inline
,然后在源文件中注释掉显式专业化定义。然后,当显式特化被 odr 使用时,编译器应该发出警告,因为它的定义不可用,尽管它被标记为 inline
:
template <> inline RNNullableTyped<int > Get(const json::json &json);