Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用constexpr变量禁用函数模板专门化或重载_C++_Template Specialization_Enable If_Glog - Fatal编程技术网

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运算符()()
{ 
cout
std::如果\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
,所以重载仍然存在,但对于伪类型。