2016-12-15 60 views
6

我想用编译时间已知值调用其中一个ctors时进行一些检查。有没有办法检测到它?SFINAE:检测一个函数是否被编译时间已知值调用

因此,当有人称之为:

A a (10); 

因为10是已知常数编译时间,我喜欢称之为一种特殊的构造函数,像这样:

template<int Value, typename = std::enable_if_t<Value <= 100>> 
A (int Value) {} 

任何想法,我该如何解决这个问题? 谢谢!

回答

4

积分常数可以解决你的问题:

struct A { 
    template<int v, std::enable_if_t<(v <= 100)>* = nullptr> 
    A(std::integral_constant<int, v>) {} 
}; 

然后,您可以使用它像这样:

A a{std:integral_constant<int, 7>{}}; 

为了方便使用,您也可以使用类似的东西是什么boost::hana呢。它定义变换成数整型常量文字操作:

A a{76_c}; // the ""_c operator outputs an std::integral_constant<int, 76> 

您可以在boost::hana documentation

+0

感谢您的想法阅读更多关于这个操作符,可惜事实并非如此。我的lib的一个非常重要的一点是它必须和简单的基本类型一样易于使用。像99%的C++程序员甚至不知道有关integral_constant。 – Melkon

+4

这实际上是一个非常好的解决方案,+1,其余99%的C++程序员应该了解'integral_constant' :)我肯定会走这条路线,如果你想要它只是在编译时测试一些常量的值时间。 – vsoftco

+0

@vsoftco这就是上下文:我正在处理一个不变的lib,它意味着根据原始类型替换断言(或其他类型的检查)并将它们放入类型信息中。其目标就是像原始类型一样简单,但会生成更好更高效的代码。这个integral_constant版本是一个很好的补充,但我的目的是默默地优化事情,而用户不必考虑它。当然,有些会使用integral_constant,但大多数不会,老实说,如果他们必须使用它,代码将不会更好,这是我想要实现的。 – Melkon

相关问题