Если вы можете использовать C ++ 17, вы можете использовать if constexpr
:
template<typename T, typename ... Ts>
void doSomething(T one, Ts...two){
if constexpr ( isOne<T>::value ) { cout << "im one" << endl;}
else if constexpr ( isTwo<T>::value){ cout <<"im two" << endl;}
}
Конечно, isOne<T>::value
и isTwo<T>::value
должны быть static constexpr
переменными.
Если вы хотите проверить типы первого аргумента функции, применяется тот же подход, только нет необходимости что-то вроде isOne
и isTwo
, вы можете использовать std::is_same_v
, чтобы увидеть, является ли первый аргумент MyClassOne
или MyClassTwo
:
#include <iostream>
#include <type_traits>
#include <vector>
class MyClassOne {};
class MyClassTwo {};
template<typename T, typename ... Ts>
void doSomething(T one, Ts...two){
if constexpr ( std::is_same_v<T, MyClassOne> )
std::cout << "im one" << std::endl;
else if constexpr ( std::is_same_v<T, MyClassTwo> )
std::cout <<"im two" << std::endl;
else
static_assert(false, "Only MyClassOne and MyClassTwo are permitted first arguments.");
}
int
main(int argc, char **argv) {
MyClassOne one;
MyClassTwo two;
doSomething(one, 1.5, two);
doSomething(two, 'c', one);
std::vector<MyClassOne> onesVector;
doSomething(onesVector, 1.0);
}
std::is_same_v<A,B>
приводит к значению true
, если типы A
и B
совпадают. Это отвечает на ваш вопрос: «если параметром один является MyClass_one, он должен вывести« im one », если его MyClass_two должен вывести« im two ».», И завершается неудачно во время компиляции, если первый аргумент имеет тип, отличный от myClassOne
или myClassTwo
.
Редактировать : добавлено static_assert
, обеспечивающее сбой компиляции, если первым аргументом является что-то еще, кроме MyClassOne
или MyClassTwo
, как это было предложено Джастином Таймом в комментарии.