簡體   English   中英

C++ 專用 function 模板別名語法

[英]C++ specialized function template alias syntax

我有

class ClassA {};
class ClassB {};

auto func_a() -> ClassA {
    return ClassA(); // example implementation for illustration. in reality can be different. does not match the form of func_b
}

auto func_b() -> ClassB {
    return ClassB(); // example implementation for illustration. in reality can be different. does not match the form of func_a
}

我希望能夠使用語法

func<ClassA>() // instead of func_a()
func<ClassB>() // instead of func_b()

(這是更大模板的一部分)

但我不知道如何為 function 別名實現此模板專業化。 幫助? 這個的語法是什么?

[編輯] 到目前為止發布的答案沒有回答我的問題,所以我將編輯我的問題以更清楚。

func_a 和 func_b 的實際定義比“return Type();”更復雜。 他們也不能被觸摸。 所以認為他們是

auto func_a() -> ClassA {
    // unknown implementation. returns ClassA somehow
}
auto func_b() -> ClassB {
    // unknown implementation. returns ClassB somehow
}

我無法模板化 func_a 或 func_b 的內容。 我需要 func<ClassA|ClassB> 的模板專門用於兩者中的每一個,並且能夠 select 調用正確的模板

您可能會執行類似 (c++17) 的操作:

template <typename T>
auto func()
{
    if constexpr (std::is_same_v<T, ClassA>) {
        return func_a();
    } else {
        return func_b();
    }
}

C++17 之前的替代方案是標簽調度(允許定制點):

// Utility class to allow to "pass" Type.
template <typename T> struct Tag{};

// Possibly in namespace details
auto func(Tag<ClassA>) { return func_a(); }
auto func(Tag<ClassB>) { return func_b(); }

template <typename T>
auto func() { return func(Tag<T>{}); }

你可以這樣做:

#include <iostream>
#include <type_traits>

class A 
{
public:
    void hi()
    {
        std::cout << "hi\n";
    }
};

class B
{
public:
    void boo()
    {
        std::cout << "boo\n";
    }
};

template<typename type_t>
auto create()
{
    // optional : if you only want to be able to create instances of A or B
    // static_assert(std::is_same_v<A, type_t> || std::is_same_v<B, type_t>);

    type_t object{};
    return object;
}

int main()
{
    auto a = create<A>();
    auto b = create<B>();

    a.hi();
    b.boo();

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM