我正在升级一些 C++ 代码以利用 C++11 中的新功能。我有一个特征类,其中有几个函数返回基本类型,这些基本类型在大多数情况下(但并非总是)返回一个常量表达式。我想根据功能是否存在来做不同的事情constexpr
。我想出了以下方法:
template<typename Trait>
struct test
{
template<int Value = Trait::f()>
static std::true_type do_call(int){ return std::true_type(); }
static std::false_type do_call(...){ return std::false_type(); }
static bool call(){ return do_call(0); }
};
struct trait
{
static int f(){ return 15; }
};
struct ctrait
{
static constexpr int f(){ return 20; }
};
int main()
{
std::cout << "regular: " << test<trait>::call() << std::endl;
std::cout << "constexpr: " << test<ctrait>::call() << std::endl;
}
额外的int
/...
参数在那里,如果在SFINAE之后两个函数都可用,则通过重载分辨率选择第一个函数。
使用Clang 3.2编译和运行它显示:
regular: 0
constexpr: 1
所以这似乎可行,但我想知道代码是否合法 C++11。特别是因为我的理解是SFINAE的规则已经改变。