使用 C++20 概念模板函数特化时的依赖关系
Dependencies when using C++20 conceptual template function specialization
我正在使用以下 C++20 代码(使用当前 GCC10 构建)进行一些测试:
template <typename ToT, typename FromT>
ToT myfunction(const FromT& pFrom) = delete;
template <typename ToT, typename FromT>
struct myclass
{
inline ToT myclassmethod(const FromT& pFrom)
{
return myfunction<ToT, FromT>(pFrom);
}
};
/* C++20 concepts code */
template <std::same_as<std::string> ToT, std::integral FromT>
inline ToT myfunction(const FromT& pFrom)
{
return std::to_string(pFrom);
}
template <std::same_as<std::string> ToT, std::floating_point FromT>
inline ToT myfunction(const FromT& pFrom)
{
return std::to_string(pFrom);
}
/* Alternative conventional code
template <>
inline std::string myfunction(const int& pFrom)
{
return std::to_string(pFrom);
}
template <>
inline std::string myfunction(const double& pFrom)
{
return std::to_string(pFrom);
}
*/
int main(int pArgc, char* pArgv[]) noexcept
{
std::cout << myclass<std::string, int>().myclassmethod(10);
std::cout << myclass<std::string, double>().myclassmethod(0.666);
return 0;
}
使用常规代码时,一切都可以正常编译。专业化按应有的方式使用。当改用 C++20 代码时,我收到错误 "use of deleted function"。
我原以为 C++20 概念特化与传统特化的工作方式相同,但显然存在差异,无法独立定义此类特化(参见相关问题 ).
这是 C++20 中需要的行为吗? C++20 有没有办法独立自定义概念函数模板(即在调用之前定义特化而不声明或定义)?
这些不是专业化,而是超载。因此,如果他们出现在他们的呼叫者之后,他们 仅 被 ADL 找到。像往常一样,您可以使用带有 forwarding wrapper 的部分特化(在本例中为受约束的特化)。 (当然,std::same_as
不是很有趣。)
我正在使用以下 C++20 代码(使用当前 GCC10 构建)进行一些测试:
template <typename ToT, typename FromT>
ToT myfunction(const FromT& pFrom) = delete;
template <typename ToT, typename FromT>
struct myclass
{
inline ToT myclassmethod(const FromT& pFrom)
{
return myfunction<ToT, FromT>(pFrom);
}
};
/* C++20 concepts code */
template <std::same_as<std::string> ToT, std::integral FromT>
inline ToT myfunction(const FromT& pFrom)
{
return std::to_string(pFrom);
}
template <std::same_as<std::string> ToT, std::floating_point FromT>
inline ToT myfunction(const FromT& pFrom)
{
return std::to_string(pFrom);
}
/* Alternative conventional code
template <>
inline std::string myfunction(const int& pFrom)
{
return std::to_string(pFrom);
}
template <>
inline std::string myfunction(const double& pFrom)
{
return std::to_string(pFrom);
}
*/
int main(int pArgc, char* pArgv[]) noexcept
{
std::cout << myclass<std::string, int>().myclassmethod(10);
std::cout << myclass<std::string, double>().myclassmethod(0.666);
return 0;
}
使用常规代码时,一切都可以正常编译。专业化按应有的方式使用。当改用 C++20 代码时,我收到错误 "use of deleted function"。
我原以为 C++20 概念特化与传统特化的工作方式相同,但显然存在差异,无法独立定义此类特化(参见相关问题
这是 C++20 中需要的行为吗? C++20 有没有办法独立自定义概念函数模板(即在调用之前定义特化而不声明或定义)?
这些不是专业化,而是超载。因此,如果他们出现在他们的呼叫者之后,他们 仅 被 ADL 找到。像往常一样,您可以使用带有 forwarding wrapper 的部分特化(在本例中为受约束的特化)。 (当然,std::same_as
不是很有趣。)