gpt4 book ai didi

c++ - 根据模板参数调用不同版本的模板成员函数

转载 作者:行者123 更新时间:2023-11-28 00:56:29 25 4
gpt4 key购买 nike

我需要根据模板参数的某些静态成员调用具有相同参数的模板成员函数的不同版本。这是我需要做的一种简化版本:


class A {
public:
//...
static const char fooString[];
};
const char A::fooString[] = "This is a Foo.";

class B {
public:
//...
static const char barString[];
};
const char B::barString[] = "This is a Bar.";

class C {
public:
//...
static const char fooString[];
};
const char C::fooString[] = "This is also a Foo.";

//Many other classes which have either a fooString or a barString

void doFoo(const char*s) { /*something*/ }
void doBar(const char*s) { /*something else*/ }

template<class T>
class Something {
public:
//This version should be called if T has a static member called "fooString",
//so it should be called if T is either class A or C
void doSomething() { doFoo(T::fooString); }

//This version should be called if T has a static member called "barString",
//so it should be called if T is class B
void doSomething() { doBar(T::barString); }
};


void someFunc()
{
Something<A> a;
Something<B> b;
Something<C> c;

a.doSomething(); //should call doFoo(A::fooString)
b.doSomething(); //should call doBar(B::barString)
c.doSomething(); //should call doFoo(C::fooString)
}

我将如何实现这一点?

最佳答案

可能的解决方案:

#include <iostream>
#include <type_traits>

class A {
public:
//...
static const char fooString[];
};
const char A::fooString[] = "This is a Foo.";

class B {
public:
//...
static const char barString[];
};
const char B::barString[] = "This is a Bar.";

class C {
public:
//...
static const char fooString[];
};
const char C::fooString[] = "This is also a Foo.";

void doFoo(const char*s) { std::cout << "doFoo: " << s << "\n"; }
void doBar(const char*s) { std::cout << "doBar: " << s << "\n"; }

template<class T>
class Something {
public:
//This version should be called if T has a static member called "fooString",
//so it should be called if T is either class A or C
template <typename TT = T, typename std::enable_if<TT::fooString != 0, bool>::type = false>
void doSomething() { doFoo(T::fooString); }

//This version should be called if T has a static member called "barString",
//so it should be called if T is class B
template <typename TT = T, typename std::enable_if<TT::barString != 0, bool>::type = false>
void doSomething() { doBar(T::barString); }
};


int main()
{
Something<A> a;
Something<B> b;
Something<C> c;

a.doSomething(); //should call doFoo(A::fooString)
b.doSomething(); //should call doBar(B::barString)
c.doSomething(); //should call doFoo(C::fooString)
}

输出:

doFoo: This is a Foo.
doBar: This is a Bar.
doFoo: This is also a Foo.

关于c++ - 根据模板参数调用不同版本的模板成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10992243/

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