3
我試圖讓默認構造函數= default;
有條件取決於類模板參數的屬性使用以下方法:明確違約模板化的構造
#include <type_traits>
#include <utility>
#include <iostream>
#include <cstdlib>
template< typename T >
struct identity
{
};
template< typename T >
struct has_property
: std::false_type
{
};
template< typename T >
struct S
{
template< typename X = T,
typename = std::enable_if_t< !has_property<X>::value > >
S(identity<X> = {})
{ std::cout << __PRETTY_FUNCTION__ << std::endl; }
template< typename X = T,
typename = std::enable_if_t< has_property<X>::value > >
#if 0
S() = default;
#else
S()
{ std::cout << __PRETTY_FUNCTION__ << std::endl; }
#endif
};
struct A {};
struct B {};
template<>
struct has_property<B>
: std::true_type
{
};
int main()
{
S<A>{};
S<B>{};
return EXIT_SUCCESS;
}
但#if 1
它給出了一個錯誤:
main.cpp:32:11: error: only special member functions may be defaulted
S() = default;
^
template<...> S()
不是的默認構造函數的聲明S
?
我可以在將來使用概念來實現這樣的調度嗎?
@Orient OK。我對這個答案並不是100%肯定的,如果標準明確表示「模板不能默認」,雖然我找不到這樣的文本,但本來不錯。我不完全確定「聲明的函數類型」對於函數模板意味着什麼。 –
@Orient你打算編輯你的帖子來刪除'constexpr'嗎? –
@Orient好吧,直到我發表評論後才顯示出來 –