【发布时间】:2018-12-26 12:51:39
【问题描述】:
考虑一个重载函数
void f(int);
void f(long);
void f(double);
void f(MyClass);
模板类中的一个方法,参数类型未知
template <class T>
struct C {
void method(T arg) { ... }
};
我想在编译时检查是否存在可以将arg 作为参数的f 版本。
template <class T>
struct C {
void method(T arg) {
if constexpr (CAN_BE_CALLED(f, arg)) {
f(arg);
} else {
g();
}
}
};
【问题讨论】:
-
至少,
if需要是constexpr if。如果f(arg);格式错误,编译器会抱怨它的存在,即使该分支永远不会被采用。使用constexpr if可以解决这个问题。 -
是否可以添加一个函数 f(),它采用任何类型并调用 g()。编译器将为您完成工作。我不知道该怎么做。可能是 void f(...){g();} ?
-
@WilliamJBagshaw
template<class T> void f(T&&) { g(); }听起来像您的建议。但是,当您使用int&或其他几乎但不完全相同的参数调用时,它会变得很棘手。 -
@Mat:
is_invocable用重载调用有点问题... -
如果您难以将自己的测试创建为模板函数并填充专业。默认模板返回 false。可用类型返回 true。那么我认为如果你希望它们是假的,你也可以添加误报。您必须自己保持同步,并且获得所有误报可能是一个问题。但看起来自动方式也很困难。
标签: c++