First you need a helper to find out if there is Args... one MyClass<T, N> :
#include <cstddef> #include <type_traits> template <class, size_t> class MyClass; template <class T> struct IsMyClass { template <size_t Size> static std::true_type test(const MyClass<T, Size>&); static std::false_type test(...); template <class V, class... Further> static constexpr bool value = ( (sizeof...(Further) == 0) && decltype(test(std::declval<V>()))::value ); };
You can use it as
IsMyClass<int>::template value<Args...>
check if Args... MyClass<int, Some_Int> . Now use this helper:
#include <cstdio> template <typename T, size_t Size> class MyClass { public: MyClass() { printf("Default constructor\n"); } template < class ...Args, class Check = std::enable_if_t<(!IsMyClass<T>::template value<Args...>)> > MyClass(Args&&... args) { printf("Args != MyClass\n"); } template <size_t Size2> MyClass(const MyClass<T, Size2>& other_sized_template) { printf("other_sized_template\n"); } };
A simple test if it works:
int main() { printf("init\n"); MyClass<int, 10> myclass_int10; MyClass<void, 10> myclass_void10; printf("1+2\n"); MyClass<int, 20> test1(myclass_int10); MyClass<int, 20> test2(myclass_void10); printf("3+4\n"); MyClass<void, 20> test3(myclass_int10); MyClass<void, 20> test4(myclass_void10); printf("5+6\n"); MyClass<int, 20> test5(myclass_int10, myclass_int10); MyClass<int, 20> test6(myclass_void10, myclass_void10); return 0; }
And it does:
$ g++ -std=c++14 ./x.cpp $ ./a.out init Default constructor Default constructor 1+2 other_sized_template Args != MyClass 3+4 Args != MyClass other_sized_template 5+6 Args != MyClass Args != MyClass
source share