C++ 不重载的类型和常量类型的常规函数

C++ 不重载的类型和常量类型的常规函数,c++,templates,sfinae,template-specialization,generic-programming,C++,Templates,Sfinae,Template Specialization,Generic Programming,我知道除非绝对必要,否则依赖SFINAE通常是个坏主意,但我很好奇如何做到以下几点 假设我有一个函数将类型打印到控制台(用于部分专门化的类,因为它更符合我的情况): 模板 类打印 { 公众: 打印(Y行) { std::cout不清楚您到底想要什么(当t是const或不是const时启用);如果您有一个函数可以打印某些类型的值,那么有必要将其包装在模板类中?您不能直接在该函数上应用SFINAE吗?)总之…一些有用的元素 (1) 从C++11开始,有一个std::is_const,可以用来检查类型

我知道除非绝对必要,否则依赖SFINAE通常是个坏主意,但我很好奇如何做到以下几点

假设我有一个函数将类型打印到控制台(用于部分专门化的类,因为它更符合我的情况):

模板
类打印
{
公众:
打印(Y行)
{

std::cout不清楚您到底想要什么(当
t
const
或不是
const
时启用);如果您有一个函数可以打印某些类型的值,那么有必要将其包装在模板类中?您不能直接在该函数上应用SFINAE吗?)总之…一些有用的元素

(1) 从C++11开始,有一个
std::is_const
,可以用来检查类型是否为常量

(2) 举个例子,下面是一种仅对常量类型启用专门化的可能方法

template <typename T, typename = void>
struct print;

template <typename T>
struct print<T, typename std::enable_if<std::is_const<T>::value>::type>
 {
   print (T line)
    { std::cout << line << std::endl; }
 };
并且,从C++17开始,也使用
std::is_const_v

struct print<T, std::enable_if_t<std::is_const_v<T>>>
struct打印
(3) 您可以直接启用/禁用构造函数,但只能生成模板(或者SFINAE无法工作)

模板
结构打印
{
模板
打印(U线)
{std::cout
注意,在这种情况下,SFINAE测试(
std::is_same
std::is_const
)也在构造函数的模板参数上,而不是在类的模板参数上,否则SFINAE不起作用


第一个
std::enable_,如果
T
U
是相同的。

不清楚您到底想要什么(当
T
const
或不是
const
时启用;如果您有一个函数可以打印某些类型的值,则有必要将其包装在模板类中?您不能将SFINAE直接应用于该函数吗?)总之…一些有用的元素

(1) 从C++11开始,有一个
std::is_const
,可以用来检查类型是否为常量

(2) 举个例子,下面是一种仅对常量类型启用专门化的可能方法

template <typename T, typename = void>
struct print;

template <typename T>
struct print<T, typename std::enable_if<std::is_const<T>::value>::type>
 {
   print (T line)
    { std::cout << line << std::endl; }
 };
并且,从C++17开始,也使用
std::is_const_v

struct print<T, std::enable_if_t<std::is_const_v<T>>>
struct打印
(3) 您可以直接启用/禁用构造函数,但只能生成模板(或者SFINAE无法工作)

模板
结构打印
{
模板
打印(U线)
{std::cout
注意,在这种情况下,SFINAE测试(
std::is_same
std::is_const
)也在构造函数的模板参数上,而不是在类的模板参数上,否则SFINAE不起作用


第一个
std::enable_,如果
T
U
是一样的。弗兰克,你能再解释一下你的意思吗?为什么它不能与const一起使用?为什么使用SFINAE是个坏主意?@formerlyknownas\U 463035818很多公司通常不喜欢模板,因为它很难维护。例如,嗯,得到它。你的真实例子需要区分<代码> const 和非const,这里的例子很好,BothGoGoE指南中包含了过多的保护和保守的指导原则。考虑到这些指南的目标是一百万行代码基础,有很多遗留代码。你可以自己做decision@Frank你能再解释一下你的意思吗?为什么它不适用于const?为什么使用SFINAE是个坏主意?@formerlyknownas_463035818很多公司一般不喜欢模板,因为它很难维护。例如,嗯,好吧,明白了。你的真实例子需要区分
的缺点BTGoGoE指南中包含了过多的保护和保守的指导方针。考虑到这些准则的目标是一百万行代码基础,有很多遗留代码。幸运的是,它们总是给出合理的理由,您可以自己做出决定。