【发布时间】:2018-09-26 09:53:20
【问题描述】:
在 C++11 中,很容易对表达式是否有效进行 SFINAE。举个例子,想象一下检查某些东西是否可以流式传输:
template <typename T>
auto print_if_possible(std::ostream& os, const T& x)
-> decltype(os << x, void());
print_if_possible 只会在os << x 是一个格式良好的表达式时参与重载解析。
我需要在 C++03 中做同样的事情,我发现sizeof 可以提供帮助(因为我需要一个未计算的表达式上下文)。这是我想出的:
template <int> struct sfinaer { };
template <typename T>
void print_if_possible(std::ostream& os, const T& x,
sfinaer<sizeof(os << x)>* = NULL);
似乎 g++ 和 clang++ 的最新版本都接受带有-std=c++03 -Wall -Wextra 的sizeof 版本。
是否保证代码在 C++03 中按预期工作?
是否可以断定 C++11 表达式 SFINAE 的任何用法都可以使用
sfinaer和sizeof向后移植到 C++03?
【问题讨论】:
-
你为什么把
, 0放在sizeof里面?在这个特定的例子中你需要它吗? -
@Evg:不需要,已删除。
-
sfinaer是个好名字。 -
考虑您的问题...如果表达式是位域,您将需要
, 0insizeof。 -
如果
<expression>.operator,(0)无效,可能会有一点副作用。
标签: c++ sizeof sfinae c++03 decltype