gpt4 book ai didi

c++ - 是否有一个 constexpr 可以让我确定是否有特定类型的输出运算符 (<<)?

转载 作者:行者123 更新时间:2023-12-05 01:24:37 27 4
gpt4 key购买 nike

为了防止编译器应用例如一个std::vector<T>std::cout << u这样的声明,我想做这样的事情:

if constexpr (std::has_output_operator<U>) {
std::cout << u;
}

有什么办法可以实现吗?

编辑(澄清)我正在研究类似 printf 的函数,它还可以打印 POD 的字符串和 vector 以及字符串(及其 vector )。

我想将此功能扩展到任何具有输出运算符的类型。

非 vector 类型的实际格式化是由函数 simpleFormat() 完成的:

// simpleFormat
// special case for single string
//
std::string simpleFormat(const std::string sFormat, const std::string t) {
size_t required = snprintf(NULL, 0, sFormat.c_str(), t.c_str());
char sTemp[required+1];
sprintf(sTemp, sFormat.c_str(), t.c_str());
return std::string(sTemp);
}

// simpleFormat
// catch for vectors (should not be sent to simpleFormat)
template<typename T>
std::string simpleFormat(const std::string sFormat, const std::vector<T> t) {
return "";
}

// simpleFormat
// formatting PODs and Objects with output operator a char using
template<typename T>
std::string simpleFormat(const std::string sFormat, const T t) {
std::string sRes = "";

if (sFormat.size() > 0) {
if (sFormat != "%O") {
size_t required = snprintf(NULL, 0, sFormat.c_str(), t);
char sTemp[required+1];
sprintf(sTemp, sFormat.c_str(), t);
sRes = std::string(sTemp);
} else {
std::stringstream ss("");
ss << t;
sRes += ss.str();
}
}

return sRes;
}

当我为某些应用程序编译这个时,得到错误

In file included from AgentCounter.cpp:6: 
../utils/stdstrutilsT.h: In instantiation of ‘std::string simpleFormat(std::string, T) [with T = __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >; std::string = std::__cxx11::basic_string<char>]’:
../utils/stdstrutilsT.h:195:33: required from ‘std::string recursiveFormat(stringvec&, stringvec&, uint, T, Args ...) [with T = __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >; Args = {long long unsigned int}; std::string = std::__cxx11::basic_string<char>; stringvec = std::vector<std::__cxx11::basic_string<char> >; uint = unsigned int]’
../utils/stdstrutilsT.h:281:31: required from ‘std::string stdsprintf(std::string, Args ...) [with Args = {__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, long long unsigned int}; std::string = std::__cxx11::basic_string<char>]’
../utils/stdstrutilsT.h:291:34: required from ‘void stdprintf(std::string, Args ...) [with Args = {__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, long long unsigned int}; std::string = std::__cxx11::basic_string<char>]’
AgentCounter.cpp:326:22: required from here
../utils/stdstrutilsT.h:165:28: error: no match for ‘operator<<’ (operand types are ‘std::stringstream’ {aka ‘std::__cxx11::basic_stringstream<char>’} and ‘const __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >’)
165 | ss << t;
| ~~~^~~~

即使我有一个 simpleFormat() vector 的变体,编译器仍然希望适合 std::vector进入 POD 变体。

这就是为什么我希望有 constexpr这让我可以查明传递的类型是否有输出运算符。

当然,如果还有其他方法可以阻止编译器将 vector 应用于我的非 vector 函数,我想了解它们。

最佳答案

这可以使用 C++20 requires-expression 直接完成,它检查其操作数是否有效:

if constexpr (requires { std::cout << u; })

您还可以定义一个名为 concept 的名称使用 requires-expression,然后在每次需要时使用它代替 requires-expression

关于c++ - 是否有一个 constexpr 可以让我确定是否有特定类型的输出运算符 (<<)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71339743/

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