C++ 使用动态bool变量实例化模板

C++ 使用动态bool变量实例化模板,c++,templates,typetraits,C++,Templates,Typetraits,我想根据布尔标志从函数返回一个类型。其想法是稍后在程序中创建一个测试类的实例,并使用这个traits结构运行,该结构将保存实际类型。但是,现在我不知道traits函数的返回类型是什么 class Test { public: template <typename T> class Traits { public: typedef T type; }; ... }; ??? Test::Options::traits(){

我想根据布尔标志从函数返回一个类型。其想法是稍后在程序中创建一个测试类的实例,并使用这个traits结构运行,该结构将保存实际类型。但是,现在我不知道traits函数的返回类型是什么

class Test {
public:
    template <typename T>
    class Traits {
    public:
        typedef T type;
    };
    ...
};

??? Test::Options::traits(){
    if(timer){
        return Test::Traits<Timeable<Test>>();
    } else {
        return Test::Traits<Test>();
    }
}
类测试{
公众:
模板
阶级特征{
公众:
T型;
};
...
};
??? 测试::选项::特征(){
中频(定时器){
返回测试::Traits();
}否则{
返回测试::Traits();
}
}

函数只能返回一种特定类型

<>在C++中没有方法在返回类型上超载。


不能动态地改变函数的返回类型。

你所寻找的是运行时多态性,而C++模板是编译时多态性。 如何使用返回值?类似于
if(它的类型是某物)。。。还有在这种情况下,可以使用
std::variant
(C++17)


还是只调用所有变体中都存在的方法?在这种情况下,可以使用良好的旧继承。将一个公共接口提取到一个纯抽象类(通常称为“接口”),从中派生出您想要返回的所有类型。啊,不要按值返回它。您可以返回,例如
std::unique_ptr
(适合您的示例,但涉及动态内存分配),或者任何其他类型的引用

C++,不幸的是,它不能以这种方式工作。不过有好消息。C++17有一个
std::variant
类型,可用于有效地执行此操作。但无论是谁调用它,都只需要做一点额外的工作,以确定返回的是哪种类型。或者,如果
timer
有效地
constexpr
,则可以通过专门化来实现。