gpt4 book ai didi

c++ - 允许模板参数仅为某些类型并根据它决定操作

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:30 25 4
gpt4 key购买 nike

假设我有两个类 MyClass_one , MyClass_two

我的函数只接受它们作为第一个参数

template<typename T,typename ...Ts>
void doSomething(T one, Ts...two){}

现在为了简单起见,如果参数 oneMyClass_one 它应该打印“im one” 如果它是 MyClass_two 它应该打印“im两个”。

如何真正实现这一点?我想出的唯一解决方案真的很难看,并且不包含编译错误抛出:

template<typename T> isOne{ static const bool value = false}
template<> isOne<MyClass_one>{ static const bool value = true}

template<typename T> isTwo{ static const bool value = false}
template<> isTwo<MyClass_two>{ static const bool value = true}

template<typename T, typename ... Ts>
void doSomething(T one, Ts...two){
if( isOne<T>::value ) { cout << "im one" << endl;}
else if ( isTwo<T>::value){ cout <<"im two" << endl;}
}

但是如何在不重载的情况下实现编译器错误检查(doSomething() 函数的多个定义)例如,如果 MyClass_one 之外的函数将无法编译>MyClass_two 通过。

感谢您的帮助。

最佳答案

如果你能用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>::valueisTwo<T>::value需要是 static constexpr变量。

如果你想检查第一个函数参数的类型,同样的方法也适用,只是不需要像 isOne 这样的东西。和 isTwo , 你可以使用 std::is_same_v查看第一个参数是否为 MyClassOneMyClassTwo :

#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类型的值 AB是相同的。这回答了你的问题“如果参数 1 是 MyClass_one,它应该打印“im one”,如果它是 MyClass_two,它应该打印“im two”。”,并且如果第一个参数是不同于 etither myClassOne 的任何类型,则在编译时失败。或 myClassTwo .

编辑:添加了一个static_assert如果第一个参数是除 MyClassOne 以外的任何其他参数,则确保编译失败或 MyClassTwo ,正如 Justin Time 在评论中所建议的那样。

关于c++ - 允许模板参数仅为某些类型并根据它决定操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54204749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com