显式模板函数实例化 - 如何查找使用它的代码点?

问题描述 投票:0回答:1

我想知道如何找到使用显式实例化模板函数的代码点。

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++ 编译器。

问候, 罗纳德。

c++ function templates
1个回答
0
投票

首先,这些是显式专业化声明,而不是显式实例化定义。显式专业化声明以

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);
© www.soinside.com 2019 - 2024. All rights reserved.