Stroustrup的書提供了一個示例如何回答這個問題:「是否可以調用f(x)
如果x
的類型爲X
」(第28.4.4節「其他示例Enable_if「)。我試圖重現這個例子,但是發現了一些錯誤,並且不明白是什麼。測試是否可以使用元編程調用f(x)
在我的代碼下面,有一個功能f(int)
。我預計has_f<int>::value
的結果是1
(true
)。實際結果是0
(false
)。
#include <type_traits>
#include <iostream>
//
// Meta if/then/else specialization
//
struct substitution_failure { };
template<typename T>
struct substitution_succeeded : std::true_type { };
template<>
struct substitution_succeeded<substitution_failure> : std::false_type { };
//
// sfinae to derive the specialization
//
template<typename T>
struct get_f_result {
private:
template<typename X>
static auto check(X const& x) -> decltype(f(x));
static substitution_failure check(...);
public:
using type = decltype(check(std::declval<T>()));
};
//
// has_f uses the derived specialization
//
template<typename T>
struct has_f : substitution_succeeded<typename get_f_result<T>::type> { };
//
// We will check if this function call be called,
// once with "char*" and once with "int".
//
int f(int i) {
std::cout << i;
return i;
}
int main() {
auto b1{has_f<char*>::value};
std::cout << "test(char*) gives: " << b1 << std::endl;
std::cout << "Just to make sure we can call f(int): ";
f(777);
std::cout << std::endl;
auto b2{has_f<int>::value};
std::cout << "test(int) gives: " << b2 << std::endl;
}
輸出:
test(char*) gives: 0
Just to make sure we can call f(int): 777
test(int) gives: 0
Bah,'is_detected'在圖書館基礎知識v2中,而不是所有圖書館基礎知識** v1 **都進入C++ 17。 :( – Yakk