gpt4 book ai didi

c++ - 使用 std::is_same::value 时没有从 'T' 到 'const char*' 的转换

转载 作者:行者123 更新时间:2023-11-27 22:46:09 26 4
gpt4 key购买 nike

我有一个类使用 operator<< 链将内容同时输出到控制台和文件。每当断行时我都需要刷新它,这发生在重新定义的 endl(替换为\n)时。这段代码不起作用并吐出很多错误(没有从 T 到 const char* 的转换)。怎么了?

#pragma once
#include <iostream>
#include <fstream>


/*class declaration*/

template <typename T>
inline Logger & Logger::operator<<(const T &a)
{
if (debug::enabled)
{
std::cout << a;
file << a;
if (this->previousLineBroken)
{
std::cout << std::flush;
file << std::flush;
this->previousLineBroken = false;
}
if (std::is_same<T, const char*>::value) {
this->previousLineBroken = (a == debug::endl);
}
return *this;
}
}

从 (const T &a) 中删除 const 只会让事情变得更糟,并产生更多错误。

UPD: previousLineBroken 是 bool,debug::endl 是 const char* = "\n"。

 //debug.h 
#pragma once
#define logger *logPtr
#include "Classes.h"
#include "logger.h"
namespace debug
{
static const char* endl = "\n";
static const bool enabled = true;
}
using debug::endl;

最佳答案

您的if 语句不是编译时 分支,因此编译器将尝试编译

this->previousLineBroken = (a == debug::endl); 

对于任何T,即使

std::is_same<T, const char*>::value 

。这可能是导致您出错的原因。您应该添加 MCVE对你的问题。


在 C++17 中,您可以使用 if constexpr 使 if 成为编译时分支:

if constexpr(std::is_same<T, const char*>::value) { 
this->previousLineBroken = (a == debug::endl);
}

在 C++11 中,您可以使用额外的辅助函数和重载代替:

template <typename T>
void setPreviousLineBroken(std::true_type, T a)
{
this->previousLineBroken = (a == debug::endl);
}

template <typename T>
void setPreviousLineBroken(std::false_type, T) { /* do nothing */ }

您的代码将如下所示:

template <typename T>
inline Logger & Logger::operator<<(const T &a)
{
if (debug::enabled)
{
std::cout << a;
file << a;
if (this->previousLineBroken)
{
std::cout << std::flush;
file << std::flush;
this->previousLineBroken = false;
}
setPreviousLineBroken(std::is_same<T, const char*>{});
return *this;
}
}

关于c++ - 使用 std::is_same<T,const char*>::value 时没有从 'T' 到 'const char*' 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42669004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com