【发布时间】:2018-01-08 07:58:30
【问题描述】:
我确实知道几种方法来检测给定类是否具有具有指定签名的函数。我想要的是在编译时推断签名。考虑:
struct test_class
{
void test( int a );
void test( float b );
};
我可以使用 decltype 和 SFINAE 来检测指定 test() 的存在,其语法很简单,例如 has_test<test_class,int>();。然而,我想要的是test_types<test_class>::types -> mpl::list< int, float > 之类的东西。任何人都有一个理智的想法如何做到这一点?要求是无法准备可检测类型的列表(因此它将检测任何test( T ),而不仅仅是我们“注册”的那些。
【问题讨论】:
-
不要认为这是可能的。如果班级有
template<class T> void test(T)怎么办? -
那我不管它——它可能会失败,它可能会堆栈溢出。我只对非模板函数感兴趣。但你是对的,它可能暗示了这项任务的不可能性:P
-
参数类型 (int,float,...) 是否有任何限制?或者它们可以是字面上的 any 类型?您可以将 test() 签名更改为功能等效的东西吗?
-
任何类型。如果我有一个 mpl::list
,我可以非常简单地做到这一点,但是没有它似乎是不可能的?功能等效是什么意思?不过可能不会。 -
你不需要类型列表,对允许的类型集有一个总顺序就足够了......所以我问了