我一直在尝试根据重载运算符是否为
例子:
template <typename T, typename std::enable_if</* ? */, int>::type = 0>
std::string stringify(const T& t)
{
std::stringstream ss;
ss << t;
return ss.str();
}
template <typename T, typename std::enable_if</* ? */, int>::type = 0>
std::string stringify(const T& t)
{
return "No overload of operator<<";
}
struct Foo { };
int main()
{
std::cout << stringify(11) << std::endl;
std::cout << stringify(Foo{}) << std::endl;
}
这可能吗?如果是这样,你将如何解决这个问题?
无需启用。\u如果
运算符
namespace detail
{
template<typename T>
auto stringify(std::stringstream& ss, T const& t, bool)
-> decltype(ss << t, void(), std::string{})
{
ss << t;
return ss.str();
}
template<typename T>
auto stringify(std::stringstream&, T const&, int)
-> std::string
{
return "No overload of operator<<";
}
}
template <typename T>
std::string stringify(const T& t)
{
std::stringstream ss;
return detail::stringify(ss, t, true);
}
现场演示
stringify
函数模板只是委托给一个::stringify
函数模板。然后,如果表达式ss,则选择第一个
此表达式
decltype(ss
第一个,
ss
中间的子表达式
val()
除了确保未选择某些用户定义的运算符
之外,不做任何其他操作(因为您不能使用val
参数类型重载运算符
)。
第三个,也是最右边的子表达式,
函数的返回类型::。std::string{}
是用来确定stringify
基本上,我想写这样的代码: 这是不可能的,因为没有重载 因此,我目前正在使用,但它并不完美。 有没有一种方法可以不重新声明函数就知道函数是否存在? 基本上,我想做一些类似的事情 和主要的:
我一直试图理解C++选择模板的方式。即,考虑以下代码示例: 前两个函数(test1)工作正常(为什么?): 一个常见的错误是声明两个仅在默认模板参数上不同的函数模板。这是非法的,因为默认模板参数不是函数模板签名的一部分,并且用相同的签名声明两个不同的函数模板是非法的。 所以看起来是这样的。但是,我看不出与前两个函数有太大的不同,前两个函数也有默认的模板参数。因此,我们对默认值(test1-work
例如,重载这两个: 因此,当被调用时,编译器将在每个调用中匹配正确的函数: 相关问题:概念会取代sfinae吗?
是否有一种方法可以更改“starts_with”命令来选择所有以大写字母和句号开头的列?我尝试使用诸如“[A-Z]”之类的修改。都没有成功。 提前致谢
条款24: 在函数重载和设定参数缺省值间慎重选择 会对函数重载和设定参数缺省值产生混淆的原因在于,它们都允许一个函数以多种方式被调用: void f(); // f被重载 void f(int x); f(); // 调用f() f(10); // 调用f(int) void g(int x = 0); // g 有一个 // 缺省参数值 g(); // 调用g(0) g(10); // 调
我有一个Redux操作,它本身分派了另外两个操作。每个操作都是从导入的函数中检索的。一个来自本地模块,另一个来自外部库。 在我的测试中,我使用一个 沙箱来存根函数,但只有两个测试通过。我期待所有3个都通过。 最后一个预期失败,错误为: TypeError:[Function:functionB]不是间谍或对间谍的调用! 当我将功能输出到控制台时,我得到了这个,这似乎与Babel导入导出导出的方式有