gpt4 book ai didi

c++ - 如何防止在省略号中使用对象

转载 作者:行者123 更新时间:2023-12-02 10:33:02 49 4
gpt4 key购买 nike

有没有一种方法可以防止将对象传递到省略号?

例:

省略号用于以下功能

int my_printf( const char * format, ... );

并且有某种类型的对象:
struct Text
{
const char * c_str();
};
Text text;

是否可以更改 struct Text以便不编译以下内容?
my_printf("%s", text ); // should fail to compile
my_printf("%s", text.c_str() ); // this was the intention

不能将 my_printf更改为使用可变参数模板参数而不是省略号。

最佳答案

使用静态断言:

#include <type_traits>

// test all parameters for being true
template<typename ... Args>
constexpr bool all(Args ... args) {
return (... && args);
}

// test if it's a class, error message has the name of the class
template<typename T>
struct not_an_object {
static const bool value = !std::is_class<T>::value;
static_assert(value, "no classes please");
};

// won't compile if there's a class object in the parameters
template<typename ... Ts, typename =
std::enable_if_t<all(not_an_object<Ts>::value ...)>>
void a_print(char const*fmt, Ts ... e){
my_printf(fmt, e...);
}

关于c++ - 如何防止在省略号中使用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61566649/

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