C++ 使用constexpr变量禁用函数模板专门化或重载
我在上游库中有一个模板化函数,我想专门化它:C++ 使用constexpr变量禁用函数模板专门化或重载,c++,template-specialization,enable-if,glog,C++,Template Specialization,Enable If,Glog,我在上游库中有一个模板化函数,我想专门化它: ///glog/logging.h 名称空间谷歌{ 模板 内联void MakeCheckOpValueString(标准::ostream*os,常量T&v){ (*os)在这段代码中,如果您在这里使用像proxy类这样的包装器,并且可以通过active_sp变量进行控制,那么您可以控制专门化 using namespace std; constexpr bool active_sp = true; template <typename
///glog/logging.h
名称空间谷歌{
模板
内联void MakeCheckOpValueString(标准::ostream*os,常量T&v){
(*os)在这段代码中,如果您在这里使用像proxy类这样的包装器,并且可以通过active_sp变量进行控制,那么您可以控制专门化
using namespace std;
constexpr bool active_sp = true;
template <typename T>
struct hello
{
void operator()()
{
cout << "hello" << endl;
}
};
struct SomeOtherType{};
template <template <typename> class m, typename T, bool active = active_sp>
struct Proxy
{
void operator()()
{
m<T>()();
}
};
template <template <typename> class m>
struct Proxy<m, SomeOtherType, true>
{
void operator()()
{
cout << "hi" << endl;
}
};
template <template <typename> class m, typename T>
struct Proxy<m, T, false>
{
void operator()()
{
m<T>()();
}
};
int main()
{
hello<int>()();
Proxy<hello, int>()();
Proxy<hello, SomeOtherType>()();
return 0;
}
使用名称空间std;
constexpr bool active_sp=true;
模板
结构你好
{
void运算符()()
{
coutstd::如果\t
无效(对于任何专业化),则启用\u
要使其友好,您必须使条件依赖于:
constexpr bool SWITCH = false;
namespace glog {
template <bool b = SWITCH>
std::enable_if_t<b> MakeCheckOpValueString(std::ostream* os, const Duration& v) {
(*os) << v.count();
}
}
constexpr bool开关=false;
名称空间glog{
模板
std::如果MakeCheckOpValueString,则启用(std::ostream*os,常量持续时间&v){
(*os)不专门化。相反,添加重载。应避免模板函数专门化。@NathanOliver好的,这允许在编译时删除中的定义吗?(包括我在编辑中的尝试)检查此链接@bakaDev我可能在那篇文章中遗漏了一些东西,但我不明白这是如何解释通过complie time bools禁用专门化(/重载)的。@pseyfert see:也考虑到我在edit2中注意到的(对我的重载/专门化需要去哪里的敏感度),我更喜欢上游模板的专门化而不是重载(这样我就可以将我的实现打包到一个头中,而不必担心包含顺序)。还有模板专门化的解决方案吗?我会说std::conditional\u t
,所以重载仍然存在,但对于伪类型。